libxml-ruby 2.8.0 → 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +859 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +98 -78
  7. data/ext/libxml/extconf.rb +61 -116
  8. data/ext/libxml/libxml.c +80 -76
  9. data/ext/libxml/ruby_libxml.h +67 -75
  10. data/ext/libxml/ruby_xml.c +937 -893
  11. data/ext/libxml/ruby_xml.h +10 -10
  12. data/ext/libxml/ruby_xml_attr.c +333 -333
  13. data/ext/libxml/ruby_xml_attr.h +12 -12
  14. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  15. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  16. data/ext/libxml/ruby_xml_attributes.c +275 -275
  17. data/ext/libxml/ruby_xml_attributes.h +15 -15
  18. data/ext/libxml/ruby_xml_cbg.c +85 -85
  19. data/ext/libxml/ruby_xml_document.c +1123 -1147
  20. data/ext/libxml/ruby_xml_document.h +11 -11
  21. data/ext/libxml/ruby_xml_dtd.c +248 -268
  22. data/ext/libxml/ruby_xml_dtd.h +9 -9
  23. data/ext/libxml/ruby_xml_encoding.c +250 -260
  24. data/ext/libxml/ruby_xml_encoding.h +16 -19
  25. data/ext/libxml/ruby_xml_error.c +996 -996
  26. data/ext/libxml/ruby_xml_error.h +12 -12
  27. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  28. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  29. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  30. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  31. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  32. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  33. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  34. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  35. data/ext/libxml/ruby_xml_io.c +47 -50
  36. data/ext/libxml/ruby_xml_io.h +10 -10
  37. data/ext/libxml/ruby_xml_namespace.c +154 -153
  38. data/ext/libxml/ruby_xml_namespace.h +10 -10
  39. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  40. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  41. data/ext/libxml/ruby_xml_node.c +1406 -1452
  42. data/ext/libxml/ruby_xml_node.h +13 -11
  43. data/ext/libxml/ruby_xml_parser.c +91 -94
  44. data/ext/libxml/ruby_xml_parser.h +12 -12
  45. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  46. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  47. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  48. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  49. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  50. data/ext/libxml/ruby_xml_reader.h +17 -17
  51. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  52. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  53. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  54. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  55. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  56. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  57. data/ext/libxml/ruby_xml_schema.c +350 -301
  58. data/ext/libxml/ruby_xml_schema.h +806 -809
  59. data/ext/libxml/ruby_xml_schema_attribute.c +61 -109
  60. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  61. data/ext/libxml/ruby_xml_schema_element.c +69 -94
  62. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  63. data/ext/libxml/ruby_xml_schema_facet.c +46 -52
  64. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  65. data/ext/libxml/ruby_xml_schema_type.c +214 -259
  66. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  67. data/ext/libxml/ruby_xml_version.h +9 -9
  68. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  69. data/ext/libxml/ruby_xml_writer.h +10 -10
  70. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  71. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  72. data/ext/libxml/ruby_xml_xpath.c +194 -188
  73. data/ext/libxml/ruby_xml_xpath.h +13 -13
  74. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  75. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  76. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  77. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  78. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  79. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  80. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  81. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  82. data/ext/vc/libxml_ruby.sln +17 -15
  83. data/lib/libxml/node.rb +2 -78
  84. data/lib/libxml/parser.rb +0 -266
  85. data/lib/libxml/sax_parser.rb +0 -17
  86. data/lib/libxml/schema/attribute.rb +19 -19
  87. data/lib/libxml/schema/element.rb +19 -27
  88. data/lib/libxml/schema/type.rb +21 -29
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml-ruby.rb +30 -0
  91. data/lib/libxml.rb +3 -33
  92. data/libxml-ruby.gemspec +48 -44
  93. data/script/benchmark/depixelate +634 -634
  94. data/script/benchmark/hamlet.xml +9054 -9054
  95. data/script/benchmark/parsecount +170 -170
  96. data/script/benchmark/throughput +41 -41
  97. data/script/test +6 -6
  98. data/setup.rb +0 -1
  99. data/test/c14n/given/example-1.xml +14 -14
  100. data/test/c14n/given/example-2.xml +11 -11
  101. data/test/c14n/given/example-3.xml +18 -18
  102. data/test/c14n/given/example-4.xml +9 -9
  103. data/test/c14n/given/example-5.xml +12 -12
  104. data/test/c14n/given/example-6.xml +2 -2
  105. data/test/c14n/given/example-7.xml +11 -11
  106. data/test/c14n/given/example-8.xml +11 -11
  107. data/test/c14n/given/example-8.xpath +9 -9
  108. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  109. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  110. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  111. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  112. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  113. data/test/c14n/result/with-comments/example-1 +5 -5
  114. data/test/c14n/result/with-comments/example-2 +10 -10
  115. data/test/c14n/result/with-comments/example-3 +13 -13
  116. data/test/c14n/result/with-comments/example-4 +8 -8
  117. data/test/c14n/result/with-comments/example-5 +3 -3
  118. data/test/c14n/result/without-comments/example-1 +3 -3
  119. data/test/c14n/result/without-comments/example-2 +10 -10
  120. data/test/c14n/result/without-comments/example-3 +13 -13
  121. data/test/c14n/result/without-comments/example-4 +8 -8
  122. data/test/c14n/result/without-comments/example-5 +2 -2
  123. data/test/model/atom.xml +12 -12
  124. data/test/model/bands.iso-8859-1.xml +4 -4
  125. data/test/model/bands.utf-8.xml +4 -4
  126. data/test/model/bands.xml +4 -4
  127. data/test/model/books.xml +153 -153
  128. data/test/model/cwm_1_0.xml +11336 -0
  129. data/test/model/merge_bug_data.xml +58 -58
  130. data/test/model/ruby-lang.html +238 -238
  131. data/test/model/rubynet.xml +79 -79
  132. data/test/model/shiporder.rnc +28 -28
  133. data/test/model/shiporder.rng +86 -86
  134. data/test/model/shiporder.xml +22 -22
  135. data/test/model/shiporder.xsd +44 -40
  136. data/test/model/shiporder_bad.xsd +40 -0
  137. data/test/model/shiporder_import.xsd +45 -0
  138. data/test/model/soap.xml +27 -27
  139. data/test/model/xinclude.xml +4 -4
  140. data/test/{tc_attr.rb → test_attr.rb} +23 -25
  141. data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
  142. data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
  143. data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
  144. data/test/test_deprecated_require.rb +12 -0
  145. data/test/{tc_document.rb → test_document.rb} +33 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +29 -29
  148. data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
  149. data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
  150. data/test/test_error.rb +178 -0
  151. data/test/test_helper.rb +4 -9
  152. data/test/test_html_parser.rb +162 -0
  153. data/test/test_html_parser_context.rb +23 -0
  154. data/test/test_namespace.rb +60 -0
  155. data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
  156. data/test/{tc_node.rb → test_node.rb} +68 -47
  157. data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
  158. data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
  159. data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
  160. data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
  161. data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
  162. data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
  163. data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
  164. data/test/test_node_xlink.rb +28 -0
  165. data/test/test_parser.rb +324 -0
  166. data/test/{tc_parser_context.rb → test_parser_context.rb} +42 -49
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +364 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +44 -38
  171. data/test/test_schema.rb +231 -0
  172. data/test/test_suite.rb +38 -40
  173. data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
  174. data/test/{tc_writer.rb → test_writer.rb} +468 -448
  175. data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
  176. data/test/test_xml.rb +263 -0
  177. data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
  178. data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
  179. data/test/test_xpath_expression.rb +37 -0
  180. data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
  181. metadata +122 -100
  182. data/lib/libxml/ns.rb +0 -22
  183. data/lib/libxml/properties.rb +0 -23
  184. data/lib/libxml/reader.rb +0 -29
  185. data/lib/libxml/xpath_object.rb +0 -16
  186. data/test/etc_doc_to_s.rb +0 -21
  187. data/test/ets_doc_file.rb +0 -17
  188. data/test/ets_doc_to_s.rb +0 -23
  189. data/test/ets_gpx.rb +0 -28
  190. data/test/ets_node_gc.rb +0 -23
  191. data/test/ets_test.xml +0 -2
  192. data/test/ets_tsr.rb +0 -11
  193. data/test/tc_deprecated_require.rb +0 -13
  194. data/test/tc_document_write.rb +0 -196
  195. data/test/tc_error.rb +0 -180
  196. data/test/tc_html_parser.rb +0 -153
  197. data/test/tc_html_parser_context.rb +0 -24
  198. data/test/tc_namespace.rb +0 -62
  199. data/test/tc_node_xlink.rb +0 -29
  200. data/test/tc_parser.rb +0 -381
  201. data/test/tc_reader.rb +0 -400
  202. data/test/tc_relaxng.rb +0 -54
  203. data/test/tc_schema.rb +0 -162
  204. data/test/tc_xml.rb +0 -226
  205. data/test/tc_xpath_expression.rb +0 -38
@@ -1,11 +1,11 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_DOCUMENT__
4
- #define __RXML_DOCUMENT__
5
-
6
- extern VALUE cXMLDocument;
7
- void rxml_init_document();
8
- VALUE rxml_document_wrap(xmlDocPtr xnode);
9
-
10
- typedef xmlChar * xmlCharPtr;
11
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_DOCUMENT__
4
+ #define __RXML_DOCUMENT__
5
+
6
+ extern VALUE cXMLDocument;
7
+ void rxml_init_document();
8
+ VALUE rxml_document_wrap(xmlDocPtr xnode);
9
+
10
+ typedef xmlChar * xmlCharPtr;
11
+ #endif
@@ -1,268 +1,248 @@
1
- #include "ruby_libxml.h"
2
- #include "ruby_xml_dtd.h"
3
-
4
- /*
5
- * Document-class: LibXML::XML::Dtd
6
- *
7
- * The XML::Dtd class is used to prepare DTD's for validation of xml
8
- * documents.
9
- *
10
- * DTDs can be created from a string or a pair of public and system identifiers.
11
- * Once a Dtd object is instantiated, an XML document can be validated by the
12
- * XML::Document#validate method providing the XML::Dtd object as parameeter.
13
- * The method will raise an exception if the document is
14
- * not valid.
15
- *
16
- * Basic usage:
17
- *
18
- * # parse DTD
19
- * dtd = XML::Dtd.new(<<EOF)
20
- * <!ELEMENT root (item*) >
21
- * <!ELEMENT item (#PCDATA) >
22
- * EOF
23
- *
24
- * # parse xml document to be validated
25
- * instance = XML::Document.file('instance.xml')
26
- *
27
- * # validate
28
- * instance.validate(dtd)
29
- */
30
-
31
- VALUE cXMLDtd;
32
-
33
- void rxml_dtd_free(xmlDtdPtr xdtd)
34
- {
35
- /* Set _private to NULL so that we won't reuse the
36
- same, freed, Ruby wrapper object later.*/
37
- xdtd->_private = NULL;
38
-
39
- if (xdtd->doc == NULL && xdtd->parent == NULL)
40
- xmlFreeDtd(xdtd);
41
- }
42
-
43
- void rxml_dtd_mark(xmlDtdPtr xdtd)
44
- {
45
- if (xdtd == NULL)
46
- return;
47
-
48
- if (xdtd->_private == NULL)
49
- {
50
- return;
51
- }
52
-
53
- rxml_node_mark((xmlNodePtr) xdtd);
54
- }
55
-
56
-
57
- static VALUE rxml_dtd_alloc(VALUE klass)
58
- {
59
- return Data_Wrap_Struct(klass, rxml_dtd_mark, rxml_dtd_free, NULL);
60
- }
61
-
62
- VALUE rxml_dtd_wrap(xmlDtdPtr xdtd)
63
- {
64
- VALUE result;
65
-
66
- // This node is already wrapped
67
- if (xdtd->_private != NULL)
68
- return (VALUE) xdtd->_private;
69
-
70
- result = Data_Wrap_Struct(cXMLDtd, NULL, NULL, xdtd);
71
-
72
- xdtd->_private = (void*) result;
73
-
74
- return result;
75
- }
76
-
77
- /*
78
- * call-seq:
79
- * dtd.external_id -> "string"
80
- *
81
- * Obtain this dtd's external identifer (for a PUBLIC DTD).
82
- */
83
- static VALUE rxml_dtd_external_id_get(VALUE self)
84
- {
85
- xmlDtdPtr xdtd;
86
- Data_Get_Struct(self, xmlDtd, xdtd);
87
-
88
-
89
- if (xdtd->ExternalID == NULL)
90
- return (Qnil);
91
- else
92
- return (rxml_new_cstr((const char*) xdtd->ExternalID, NULL));
93
- }
94
-
95
- /*
96
- * call-seq:
97
- * dtd.name -> "string"
98
- *
99
- * Obtain this dtd's name.
100
- */
101
- static VALUE rxml_dtd_name_get(VALUE self)
102
- {
103
- xmlDtdPtr xdtd;
104
- Data_Get_Struct(self, xmlDtd, xdtd);
105
-
106
-
107
- if (xdtd->name == NULL)
108
- return (Qnil);
109
- else
110
- return (rxml_new_cstr((const char*) xdtd->name, NULL));
111
- }
112
-
113
-
114
- /*
115
- * call-seq:
116
- * dtd.uri -> "string"
117
- *
118
- * Obtain this dtd's URI (for a SYSTEM or PUBLIC DTD).
119
- */
120
- static VALUE rxml_dtd_uri_get(VALUE self)
121
- {
122
- xmlDtdPtr xdtd;
123
- Data_Get_Struct(self, xmlDtd, xdtd);
124
-
125
- if (xdtd->SystemID == NULL)
126
- return (Qnil);
127
- else
128
- return (rxml_new_cstr((const char*) xdtd->SystemID, NULL));
129
- }
130
-
131
- /*
132
- * call-seq:
133
- * node.type -> num
134
- *
135
- * Obtain this node's type identifier.
136
- */
137
- static VALUE rxml_dtd_type(VALUE self)
138
- {
139
- xmlDtdPtr xdtd;
140
- Data_Get_Struct(self, xmlDtd, xdtd);
141
- return (INT2NUM(xdtd->type));
142
- }
143
-
144
- /*
145
- * call-seq:
146
- * XML::Dtd.new("DTD string") -> dtd
147
- * XML::Dtd.new("public", "system") -> dtd
148
- * XML::Dtd.new("name", "public", "system", document) -> external subset dtd
149
- * XML::Dtd.new("name", "public", "system", document, false) -> internal subset dtd
150
- * XML::Dtd.new("name", "public", "system", document, true) -> internal subset dtd
151
- *
152
- * Create a new Dtd from the specified public and system
153
- * identifiers.
154
- */
155
- static VALUE rxml_dtd_initialize(int argc, VALUE *argv, VALUE self)
156
- {
157
- VALUE external, system, dtd_string;
158
- xmlParserInputBufferPtr buffer;
159
- xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
160
- xmlChar *new_string;
161
- xmlDtdPtr xdtd;
162
-
163
- // 1 argument -- string --> parsujeme jako dtd
164
- // 2 arguments -- public, system --> bude se hledat
165
- // 3 arguments -- public, system, name --> creates an external subset (any parameter may be nil)
166
- // 4 arguments -- public, system, name, doc --> creates an external subset (any parameter may be nil)
167
- // 5 arguments -- public, system, name, doc, true --> creates an internal subset (all but last parameter may be nil)
168
- switch (argc)
169
- {
170
- case 3:
171
- case 4:
172
- case 5: {
173
- VALUE name, doc, internal;
174
- const xmlChar *xname = NULL, *xpublic = NULL, *xsystem = NULL;
175
- xmlDocPtr xdoc = NULL;
176
-
177
- rb_scan_args(argc, argv, "32", &external, &system, &name, &doc, &internal);
178
-
179
- if (external != Qnil) {
180
- Check_Type(external, T_STRING);
181
- xpublic = (const xmlChar*) StringValuePtr(external);
182
- }
183
- if (system != Qnil) {
184
- Check_Type(system, T_STRING);
185
- xsystem = (const xmlChar*) StringValuePtr(system);
186
- }
187
- if (name != Qnil) {
188
- Check_Type(name, T_STRING);
189
- xname = (const xmlChar*) StringValuePtr(name);
190
- }
191
- if (doc != Qnil) {
192
- if (rb_obj_is_kind_of(doc, cXMLDocument) == Qfalse)
193
- rb_raise(rb_eTypeError, "Must pass an XML::Document object");
194
- Data_Get_Struct(doc, xmlDoc, xdoc);
195
- }
196
-
197
- if (internal == Qnil || internal == Qfalse)
198
- xdtd = xmlNewDtd(xdoc, xname, xpublic, xsystem);
199
- else
200
- xdtd = xmlCreateIntSubset(xdoc, xname, xpublic, xsystem);
201
-
202
- if (xdtd == NULL)
203
- rxml_raise(&xmlLastError);
204
-
205
- /* Document will free this dtd now. */
206
- RDATA(self)->dfree = NULL;
207
- DATA_PTR(self) = xdtd;
208
-
209
- xmlSetTreeDoc((xmlNodePtr) xdtd, xdoc);
210
- }
211
- break;
212
-
213
- case 2:
214
- rb_scan_args(argc, argv, "20", &external, &system);
215
-
216
- Check_Type(external, T_STRING);
217
- Check_Type(system, T_STRING);
218
-
219
- xdtd = xmlParseDTD((xmlChar*) StringValuePtr(external),
220
- (xmlChar*) StringValuePtr(system));
221
-
222
- if (xdtd == NULL)
223
- rxml_raise(&xmlLastError);
224
-
225
- DATA_PTR(self) = xdtd;
226
-
227
- xmlSetTreeDoc((xmlNodePtr) xdtd, NULL);
228
- break;
229
-
230
- case 1:
231
- rb_scan_args(argc, argv, "10", &dtd_string);
232
- Check_Type(dtd_string, T_STRING);
233
-
234
- /* Note that buffer is freed by xmlParserInputBufferPush*/
235
- buffer = xmlAllocParserInputBuffer(enc);
236
- new_string = xmlStrdup((xmlChar*) StringValuePtr(dtd_string));
237
- xmlParserInputBufferPush(buffer, xmlStrlen(new_string),
238
- (const char*) new_string);
239
-
240
- xdtd = xmlIOParseDTD(NULL, buffer, enc);
241
-
242
- if (xdtd == NULL)
243
- rxml_raise(&xmlLastError);
244
-
245
- xmlFree(new_string);
246
-
247
- DATA_PTR(self) = xdtd;
248
- break;
249
-
250
- default:
251
- rb_raise(rb_eArgError, "wrong number of arguments");
252
- }
253
-
254
- return self;
255
- }
256
-
257
- void rxml_init_dtd()
258
- {
259
- cXMLDtd = rb_define_class_under(mXML, "Dtd", rb_cObject);
260
- rb_define_alloc_func(cXMLDtd, rxml_dtd_alloc);
261
- rb_define_method(cXMLDtd, "initialize", rxml_dtd_initialize, -1);
262
- rb_define_method(cXMLDtd, "external_id", rxml_dtd_external_id_get, 0);
263
- rb_define_method(cXMLDtd, "name", rxml_dtd_name_get, 0);
264
- rb_define_method(cXMLDtd, "uri", rxml_dtd_uri_get, 0);
265
- rb_define_method(cXMLDtd, "node_type", rxml_dtd_type, 0);
266
- rb_define_alias(cXMLDtd, "system_id", "uri");
267
- }
268
-
1
+ #include "ruby_libxml.h"
2
+ #include "ruby_xml_dtd.h"
3
+
4
+ /*
5
+ * Document-class: LibXML::XML::Dtd
6
+ *
7
+ * The XML::Dtd class is used to prepare DTD's for validation of xml
8
+ * documents.
9
+ *
10
+ * DTDs can be created from a string or a pair of public and system identifiers.
11
+ * Once a Dtd object is instantiated, an XML document can be validated by the
12
+ * XML::Document#validate method providing the XML::Dtd object as parameeter.
13
+ * The method will raise an exception if the document is
14
+ * not valid.
15
+ *
16
+ * Basic usage:
17
+ *
18
+ * # parse DTD
19
+ * dtd = XML::Dtd.new(<<EOF)
20
+ * <!ELEMENT root (item*) >
21
+ * <!ELEMENT item (#PCDATA) >
22
+ * EOF
23
+ *
24
+ * # parse xml document to be validated
25
+ * instance = XML::Document.file('instance.xml')
26
+ *
27
+ * # validate
28
+ * instance.validate(dtd)
29
+ */
30
+
31
+ VALUE cXMLDtd;
32
+
33
+ void rxml_dtd_free(xmlDtdPtr xdtd)
34
+ {
35
+ if (xdtd->doc == NULL && xdtd->parent == NULL)
36
+ xmlFreeDtd(xdtd);
37
+ }
38
+
39
+ void rxml_dtd_mark(xmlDtdPtr xdtd)
40
+ {
41
+ if (xdtd && xdtd->doc)
42
+ {
43
+ VALUE doc = (VALUE)xdtd->doc->_private;
44
+ rb_gc_mark(doc);
45
+ }
46
+ }
47
+
48
+ static VALUE rxml_dtd_alloc(VALUE klass)
49
+ {
50
+ return Data_Wrap_Struct(klass, rxml_dtd_mark, rxml_dtd_free, NULL);
51
+ }
52
+
53
+ VALUE rxml_dtd_wrap(xmlDtdPtr xdtd)
54
+ {
55
+ return Data_Wrap_Struct(cXMLDtd, NULL, NULL, xdtd);
56
+ }
57
+
58
+ /*
59
+ * call-seq:
60
+ * dtd.external_id -> "string"
61
+ *
62
+ * Obtain this dtd's external identifer (for a PUBLIC DTD).
63
+ */
64
+ static VALUE rxml_dtd_external_id_get(VALUE self)
65
+ {
66
+ xmlDtdPtr xdtd;
67
+ Data_Get_Struct(self, xmlDtd, xdtd);
68
+
69
+
70
+ if (xdtd->ExternalID == NULL)
71
+ return (Qnil);
72
+ else
73
+ return (rxml_new_cstr( xdtd->ExternalID, NULL));
74
+ }
75
+
76
+ /*
77
+ * call-seq:
78
+ * dtd.name -> "string"
79
+ *
80
+ * Obtain this dtd's name.
81
+ */
82
+ static VALUE rxml_dtd_name_get(VALUE self)
83
+ {
84
+ xmlDtdPtr xdtd;
85
+ Data_Get_Struct(self, xmlDtd, xdtd);
86
+
87
+
88
+ if (xdtd->name == NULL)
89
+ return (Qnil);
90
+ else
91
+ return (rxml_new_cstr( xdtd->name, NULL));
92
+ }
93
+
94
+
95
+ /*
96
+ * call-seq:
97
+ * dtd.uri -> "string"
98
+ *
99
+ * Obtain this dtd's URI (for a SYSTEM or PUBLIC DTD).
100
+ */
101
+ static VALUE rxml_dtd_uri_get(VALUE self)
102
+ {
103
+ xmlDtdPtr xdtd;
104
+ Data_Get_Struct(self, xmlDtd, xdtd);
105
+
106
+ if (xdtd->SystemID == NULL)
107
+ return (Qnil);
108
+ else
109
+ return (rxml_new_cstr( xdtd->SystemID, NULL));
110
+ }
111
+
112
+ /*
113
+ * call-seq:
114
+ * node.type -> num
115
+ *
116
+ * Obtain this node's type identifier.
117
+ */
118
+ static VALUE rxml_dtd_type(VALUE self)
119
+ {
120
+ xmlDtdPtr xdtd;
121
+ Data_Get_Struct(self, xmlDtd, xdtd);
122
+ return (INT2NUM(xdtd->type));
123
+ }
124
+
125
+ /*
126
+ * call-seq:
127
+ * XML::Dtd.new("DTD string") -> dtd
128
+ * XML::Dtd.new("public", "system") -> dtd
129
+ * XML::Dtd.new("name", "public", "system", document) -> external subset dtd
130
+ * XML::Dtd.new("name", "public", "system", document, false) -> internal subset dtd
131
+ * XML::Dtd.new("name", "public", "system", document, true) -> internal subset dtd
132
+ *
133
+ * Create a new Dtd from the specified public and system
134
+ * identifiers.
135
+ */
136
+ static VALUE rxml_dtd_initialize(int argc, VALUE *argv, VALUE self)
137
+ {
138
+ VALUE external, system, dtd_string;
139
+ xmlParserInputBufferPtr buffer;
140
+ xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
141
+ xmlChar *new_string;
142
+ xmlDtdPtr xdtd;
143
+
144
+ // 1 argument -- string --> parsujeme jako dtd
145
+ // 2 arguments -- public, system --> bude se hledat
146
+ // 3 arguments -- public, system, name --> creates an external subset (any parameter may be nil)
147
+ // 4 arguments -- public, system, name, doc --> creates an external subset (any parameter may be nil)
148
+ // 5 arguments -- public, system, name, doc, true --> creates an internal subset (all but last parameter may be nil)
149
+ switch (argc)
150
+ {
151
+ case 3:
152
+ case 4:
153
+ case 5: {
154
+ VALUE name, doc, internal;
155
+ const xmlChar *xname = NULL, *xpublic = NULL, *xsystem = NULL;
156
+ xmlDocPtr xdoc = NULL;
157
+
158
+ rb_scan_args(argc, argv, "32", &external, &system, &name, &doc, &internal);
159
+
160
+ if (external != Qnil) {
161
+ Check_Type(external, T_STRING);
162
+ xpublic = (const xmlChar*) StringValuePtr(external);
163
+ }
164
+ if (system != Qnil) {
165
+ Check_Type(system, T_STRING);
166
+ xsystem = (const xmlChar*) StringValuePtr(system);
167
+ }
168
+ if (name != Qnil) {
169
+ Check_Type(name, T_STRING);
170
+ xname = (const xmlChar*) StringValuePtr(name);
171
+ }
172
+ if (doc != Qnil) {
173
+ if (rb_obj_is_kind_of(doc, cXMLDocument) == Qfalse)
174
+ rb_raise(rb_eTypeError, "Must pass an LibXML::XML::Document object");
175
+ Data_Get_Struct(doc, xmlDoc, xdoc);
176
+ }
177
+
178
+ if (internal == Qnil || internal == Qfalse)
179
+ xdtd = xmlNewDtd(xdoc, xname, xpublic, xsystem);
180
+ else
181
+ xdtd = xmlCreateIntSubset(xdoc, xname, xpublic, xsystem);
182
+
183
+ if (xdtd == NULL)
184
+ rxml_raise(&xmlLastError);
185
+
186
+ /* Document will free this dtd now. */
187
+ RDATA(self)->dfree = NULL;
188
+ DATA_PTR(self) = xdtd;
189
+
190
+ xmlSetTreeDoc((xmlNodePtr) xdtd, xdoc);
191
+ }
192
+ break;
193
+
194
+ case 2:
195
+ rb_scan_args(argc, argv, "20", &external, &system);
196
+
197
+ Check_Type(external, T_STRING);
198
+ Check_Type(system, T_STRING);
199
+
200
+ xdtd = xmlParseDTD((xmlChar*) StringValuePtr(external),
201
+ (xmlChar*) StringValuePtr(system));
202
+
203
+ if (xdtd == NULL)
204
+ rxml_raise(&xmlLastError);
205
+
206
+ DATA_PTR(self) = xdtd;
207
+
208
+ xmlSetTreeDoc((xmlNodePtr) xdtd, NULL);
209
+ break;
210
+
211
+ case 1:
212
+ rb_scan_args(argc, argv, "10", &dtd_string);
213
+ Check_Type(dtd_string, T_STRING);
214
+
215
+ /* Note that buffer is freed by xmlParserInputBufferPush*/
216
+ buffer = xmlAllocParserInputBuffer(enc);
217
+ new_string = xmlStrdup((xmlChar*) StringValuePtr(dtd_string));
218
+ xmlParserInputBufferPush(buffer, xmlStrlen(new_string),
219
+ (const char*) new_string);
220
+
221
+ xdtd = xmlIOParseDTD(NULL, buffer, enc);
222
+
223
+ if (xdtd == NULL)
224
+ rxml_raise(&xmlLastError);
225
+
226
+ xmlFree(new_string);
227
+
228
+ DATA_PTR(self) = xdtd;
229
+ break;
230
+
231
+ default:
232
+ rb_raise(rb_eArgError, "wrong number of arguments");
233
+ }
234
+
235
+ return self;
236
+ }
237
+
238
+ void rxml_init_dtd()
239
+ {
240
+ cXMLDtd = rb_define_class_under(mXML, "Dtd", rb_cObject);
241
+ rb_define_alloc_func(cXMLDtd, rxml_dtd_alloc);
242
+ rb_define_method(cXMLDtd, "initialize", rxml_dtd_initialize, -1);
243
+ rb_define_method(cXMLDtd, "external_id", rxml_dtd_external_id_get, 0);
244
+ rb_define_method(cXMLDtd, "name", rxml_dtd_name_get, 0);
245
+ rb_define_method(cXMLDtd, "uri", rxml_dtd_uri_get, 0);
246
+ rb_define_method(cXMLDtd, "node_type", rxml_dtd_type, 0);
247
+ rb_define_alias(cXMLDtd, "system_id", "uri");
248
+ }
@@ -1,9 +1,9 @@
1
- #ifndef __RXML_DTD__
2
- #define __RXML_DTD__
3
-
4
- extern VALUE cXMLDtd;
5
-
6
- void rxml_init_dtd(void);
7
- VALUE rxml_dtd_wrap(xmlDtdPtr xdtd);
8
-
9
- #endif
1
+ #ifndef __RXML_DTD__
2
+ #define __RXML_DTD__
3
+
4
+ extern VALUE cXMLDtd;
5
+
6
+ void rxml_init_dtd(void);
7
+ VALUE rxml_dtd_wrap(xmlDtdPtr xdtd);
8
+
9
+ #endif