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,301 +1,350 @@
1
- #include "ruby_libxml.h"
2
- #define LIBXML_OUTPUT_ENABLED
3
- #define DUMP_CONTENT_MODEL
4
- #include "ruby_xml_schema.h"
5
-
6
- #include "ruby_xml_schema_type.h"
7
- #include "ruby_xml_schema_element.h"
8
- #include "ruby_xml_schema_attribute.h"
9
- #include "ruby_xml_schema_facet.h"
10
-
11
-
12
- /*
13
- * Document-class: LibXML::XML::Schema
14
- *
15
- * The XML::Schema class is used to prepare XML Schemas for validation of xml
16
- * documents.
17
- *
18
- * Schemas can be created from XML documents, strinings or URIs using the
19
- * corresponding methods (new for URIs).
20
- *
21
- * Once a schema is prepared, an XML document can be validated by the
22
- * XML::Document#validate_schema method providing the XML::Schema object
23
- * as parameter. The method return true if the document validates, false
24
- * otherwise.
25
- *
26
- * Basic usage:
27
- *
28
- * # parse schema as xml document
29
- * schema_document = XML::Document.file('schema.rng')
30
- *
31
- * # prepare schema for validation
32
- * schema = XML::Schema.document(schema_document)
33
- *
34
- * # parse xml document to be validated
35
- * instance = XML::Document.file('instance.xml')
36
- *
37
- * # validate
38
- * instance.validate_schema(schema)
39
- */
40
-
41
- VALUE cXMLSchema;
42
-
43
- static void rxml_schema_free(xmlSchemaPtr xschema)
44
- {
45
- xmlSchemaFree(xschema);
46
- }
47
-
48
- VALUE rxml_wrap_schema(xmlSchemaPtr xschema)
49
- {
50
- return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
51
- }
52
-
53
-
54
- /*
55
- * call-seq:
56
- * XML::Schema.initialize(schema_uri) -> schema
57
- *
58
- * Create a new schema from the specified URI.
59
- */
60
- static VALUE rxml_schema_init_from_uri(VALUE class, VALUE uri)
61
- {
62
- xmlSchemaParserCtxtPtr xparser;
63
- xmlSchemaPtr xschema;
64
-
65
- Check_Type(uri, T_STRING);
66
-
67
- xparser = xmlSchemaNewParserCtxt(StringValuePtr(uri));
68
- xschema = xmlSchemaParse(xparser);
69
- xmlSchemaFreeParserCtxt(xparser);
70
-
71
- return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
72
- }
73
-
74
- /*
75
- * call-seq:
76
- * XML::Schema.document(document) -> schema
77
- *
78
- * Create a new schema from the specified document.
79
- */
80
- static VALUE rxml_schema_init_from_document(VALUE class, VALUE document)
81
- {
82
- xmlDocPtr xdoc;
83
- xmlSchemaPtr xschema;
84
- xmlSchemaParserCtxtPtr xparser;
85
-
86
- Data_Get_Struct(document, xmlDoc, xdoc);
87
-
88
- xparser = xmlSchemaNewDocParserCtxt(xdoc);
89
- xschema = xmlSchemaParse(xparser);
90
- xmlSchemaFreeParserCtxt(xparser);
91
-
92
- if (xschema == NULL)
93
- return Qnil;
94
-
95
- return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
96
- }
97
-
98
- /*
99
- * call-seq:
100
- * XML::Schema.from_string("schema_data") -> "value"
101
- *
102
- * Create a new schema using the specified string.
103
- */
104
- static VALUE rxml_schema_init_from_string(VALUE self, VALUE schema_str)
105
- {
106
- xmlSchemaParserCtxtPtr xparser;
107
- xmlSchemaPtr xschema;
108
-
109
- Check_Type(schema_str, T_STRING);
110
-
111
- xparser = xmlSchemaNewMemParserCtxt(StringValuePtr(schema_str), strlen(
112
- StringValuePtr(schema_str)));
113
- xschema = xmlSchemaParse(xparser);
114
- xmlSchemaFreeParserCtxt(xparser);
115
-
116
- return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
117
- }
118
-
119
-
120
- static VALUE rxml_schema_target_namespace(VALUE self)
121
- {
122
- xmlSchemaPtr xschema;
123
-
124
- Data_Get_Struct(self, xmlSchema, xschema);
125
-
126
- QNIL_OR_STRING(xschema->targetNamespace)
127
- }
128
-
129
- static VALUE rxml_schema_name(VALUE self)
130
- {
131
- xmlSchemaPtr xschema;
132
-
133
- Data_Get_Struct(self, xmlSchema, xschema);
134
-
135
- QNIL_OR_STRING(xschema->name)
136
- }
137
-
138
- static VALUE rxml_schema_version(VALUE self)
139
- {
140
- xmlSchemaPtr xschema;
141
-
142
- Data_Get_Struct(self, xmlSchema, xschema);
143
-
144
- QNIL_OR_STRING(xschema->version)
145
- }
146
-
147
- static VALUE rxml_schema_id(VALUE self)
148
- {
149
- xmlSchemaPtr xschema;
150
-
151
- Data_Get_Struct(self, xmlSchema, xschema);
152
-
153
- QNIL_OR_STRING(xschema->id)
154
- }
155
-
156
-
157
- static VALUE rxml_schema_document(VALUE self)
158
- {
159
- xmlSchemaPtr xschema;
160
-
161
- Data_Get_Struct(self, xmlSchema, xschema);
162
-
163
- return rxml_node_wrap(xmlDocGetRootElement(xschema->doc));
164
- }
165
-
166
- static void storeNs(xmlSchemaImportPtr import, VALUE self, xmlChar *nsname)
167
- {
168
- VALUE schemas;
169
- xmlNodePtr xnode;
170
- xmlNsPtr xns;
171
-
172
- schemas = rb_iv_get(self, "@namespaces");
173
- if (import->doc) {
174
- xnode = xmlDocGetRootElement(import->doc);
175
-
176
- xns = xnode->nsDef;
177
-
178
- while (xns) {
179
- VALUE anamespace = rxml_namespace_wrap(xns);
180
- rb_ary_push(schemas, anamespace);
181
- xns = xns->next;
182
- }
183
- }
184
- }
185
-
186
- static VALUE rxml_schema_namespaces(VALUE self)
187
- {
188
- VALUE schemas;
189
- xmlSchemaPtr xschema;
190
-
191
- Data_Get_Struct(self, xmlSchema, xschema);
192
-
193
- if (rb_iv_get(self, "@namespaces") == Qnil) {
194
- schemas = rb_ary_new();
195
- rb_iv_set(self, "@namespaces", schemas);
196
- xmlHashScan(xschema->schemasImports, (xmlHashScanner) storeNs, (void *)self);
197
- }
198
-
199
- return rb_iv_get(self, "@namespaces");
200
- }
201
-
202
- static void storeType(xmlSchemaTypePtr type, VALUE self, xmlChar *name)
203
- {
204
- VALUE types;
205
- VALUE rtype;
206
-
207
- types = rb_iv_get(self, "@types");
208
- rtype = rxml_wrap_schema_type(type);
209
-
210
- rb_hash_aset(types, rb_str_new2(name), rtype);
211
- }
212
-
213
- static VALUE rxml_schema_collect_types(VALUE self);
214
-
215
- static VALUE rxml_schema_types(VALUE self)
216
- {
217
- VALUE types;
218
- xmlSchemaPtr xschema;
219
-
220
- Data_Get_Struct(self, xmlSchema, xschema);
221
-
222
- if (rb_iv_get(self, "@types") == Qnil) {
223
- types = rb_hash_new();
224
- rb_iv_set(self, "@types", types);
225
- rxml_schema_collect_types(self);
226
- if(xschema != NULL && xschema->typeDecl != NULL)
227
- xmlHashScan(xschema->typeDecl, (xmlHashScanner) storeType, (void *)self);
228
- }
229
-
230
- return rb_iv_get(self, "@types");
231
- }
232
-
233
- static void storeElement(xmlSchemaElementPtr element, VALUE self, xmlChar *name)
234
- {
235
- VALUE elements;
236
- VALUE relement;
237
-
238
- elements = rb_iv_get(self, "@elements");
239
- relement = rxml_wrap_schema_element(element);
240
- rb_hash_aset(elements, rb_str_new2(name), relement);
241
- }
242
-
243
- static VALUE rxml_schema_elements(VALUE self)
244
- {
245
- VALUE elements;
246
- xmlSchemaPtr xschema;
247
-
248
- Data_Get_Struct(self, xmlSchema, xschema);
249
-
250
- if (rb_iv_get(self, "@elements") == Qnil) {
251
- elements = rb_hash_new();
252
- rb_iv_set(self, "@elements", elements);
253
- xmlHashScan(xschema->elemDecl, (xmlHashScanner) storeElement, (void *)self);
254
- }
255
-
256
- return rb_iv_get(self, "@elements");
257
- }
258
-
259
- static void collectSchemaTypes(xmlSchemaImportPtr import, VALUE self)
260
- {
261
- if (import->imported && import->schema) {
262
- xmlHashScan(import->schema->typeDecl, (xmlHashScanner) storeType, (void *)self);
263
- }
264
- }
265
-
266
- static VALUE rxml_schema_collect_types(VALUE self)
267
- {
268
- xmlSchemaPtr xschema;
269
-
270
- Data_Get_Struct(self, xmlSchema, xschema);
271
-
272
- if(xschema){
273
- xmlHashScan(xschema->schemasImports, (xmlHashScanner) collectSchemaTypes, (void *)self);
274
- }
275
-
276
- return Qnil;
277
- }
278
-
279
- void rxml_init_schema(void)
280
- {
281
- cXMLSchema = rb_define_class_under(mXML, "Schema", rb_cObject);
282
- rb_define_singleton_method(cXMLSchema, "new", rxml_schema_init_from_uri, 1);
283
- rb_define_singleton_method(cXMLSchema, "from_string", rxml_schema_init_from_string, 1);
284
- rb_define_singleton_method(cXMLSchema, "document", rxml_schema_init_from_document, 1);
285
-
286
- rb_define_method(cXMLSchema, "target_namespace", rxml_schema_target_namespace, 0);
287
- rb_define_method(cXMLSchema, "name", rxml_schema_name, 0);
288
- rb_define_method(cXMLSchema, "id", rxml_schema_id, 0);
289
- rb_define_method(cXMLSchema, "version", rxml_schema_version, 0);
290
- rb_define_method(cXMLSchema, "document", rxml_schema_document, 0);
291
-
292
- rb_define_method(cXMLSchema, "_namespaces", rxml_schema_namespaces, 0);
293
- rb_define_method(cXMLSchema, "_collect_types", rxml_schema_collect_types, 0);
294
- rb_define_method(cXMLSchema, "types", rxml_schema_types, 0);
295
- rb_define_method(cXMLSchema, "elements", rxml_schema_elements, 0);
296
-
297
- rxml_init_schema_facet();
298
- rxml_init_schema_element();
299
- rxml_init_schema_attribute();
300
- rxml_init_schema_type();
301
- }
1
+ #include "ruby_libxml.h"
2
+ #define LIBXML_OUTPUT_ENABLED
3
+ #define DUMP_CONTENT_MODEL
4
+ #include "ruby_xml_schema.h"
5
+
6
+ #include "ruby_xml_schema_type.h"
7
+ #include "ruby_xml_schema_element.h"
8
+ #include "ruby_xml_schema_attribute.h"
9
+ #include "ruby_xml_schema_facet.h"
10
+
11
+ /*
12
+ * Document-class: LibXML::XML::Schema
13
+ *
14
+ * The XML::Schema class is used to prepare XML Schemas for validation of xml
15
+ * documents.
16
+ *
17
+ * Schemas can be created from XML documents, strinings or URIs using the
18
+ * corresponding methods (new for URIs).
19
+ *
20
+ * Once a schema is prepared, an XML document can be validated by the
21
+ * XML::Document#validate_schema method providing the XML::Schema object
22
+ * as parameter. The method return true if the document validates, false
23
+ * otherwise.
24
+ *
25
+ * Basic usage:
26
+ *
27
+ * # parse schema as xml document
28
+ * schema_document = XML::Document.file('schema.rng')
29
+ *
30
+ * # prepare schema for validation
31
+ * schema = XML::Schema.document(schema_document)
32
+ *
33
+ * # parse xml document to be validated
34
+ * instance = XML::Document.file('instance.xml')
35
+ *
36
+ * # validate
37
+ * instance.validate_schema(schema)
38
+ */
39
+
40
+ VALUE cXMLSchema;
41
+
42
+ static void rxml_schema_free(xmlSchemaPtr xschema)
43
+ {
44
+ xmlSchemaFree(xschema);
45
+ }
46
+
47
+ VALUE rxml_wrap_schema(xmlSchemaPtr xschema)
48
+ {
49
+ VALUE result;
50
+
51
+ if (!xschema)
52
+ rb_raise(rb_eArgError, "XML::Schema is required!");
53
+
54
+ result = Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
55
+
56
+ /*
57
+ * Create these as instance variables to provide the output of inspect/to_str some
58
+ * idea of what schema this class contains.
59
+ */
60
+ rb_iv_set(result, "@target_namespace", QNIL_OR_STRING(xschema->targetNamespace));
61
+ rb_iv_set(result, "@name", QNIL_OR_STRING(xschema->name));
62
+ rb_iv_set(result, "@id", QNIL_OR_STRING(xschema->id));
63
+ rb_iv_set(result, "@version", QNIL_OR_STRING(xschema->name));
64
+
65
+ return result;
66
+ }
67
+
68
+ static VALUE rxml_schema_init(VALUE class, xmlSchemaParserCtxtPtr xparser)
69
+ {
70
+ xmlSchemaPtr xschema;
71
+
72
+ xschema = xmlSchemaParse(xparser);
73
+ xmlSchemaFreeParserCtxt(xparser);
74
+
75
+ if (!xschema)
76
+ rxml_raise(&xmlLastError);
77
+
78
+ return rxml_wrap_schema(xschema);
79
+ }
80
+
81
+ /*
82
+ * call-seq:
83
+ * XML::Schema.initialize(schema_uri) -> schema
84
+ *
85
+ * Create a new schema from the specified URI.
86
+ */
87
+ static VALUE rxml_schema_init_from_uri(VALUE class, VALUE uri)
88
+ {
89
+ xmlSchemaParserCtxtPtr xparser;
90
+
91
+ Check_Type(uri, T_STRING);
92
+
93
+ xmlResetLastError();
94
+ xparser = xmlSchemaNewParserCtxt(StringValuePtr(uri));
95
+ if (!xparser)
96
+ rxml_raise(&xmlLastError);
97
+
98
+ return rxml_schema_init(class, xparser);
99
+ }
100
+
101
+ /*
102
+ * call-seq:
103
+ * XML::Schema.document(document) -> schema
104
+ *
105
+ * Create a new schema from the specified document.
106
+ */
107
+ static VALUE rxml_schema_init_from_document(VALUE class, VALUE document)
108
+ {
109
+ xmlDocPtr xdoc;
110
+ xmlSchemaParserCtxtPtr xparser;
111
+
112
+ Data_Get_Struct(document, xmlDoc, xdoc);
113
+
114
+ xmlResetLastError();
115
+ xparser = xmlSchemaNewDocParserCtxt(xdoc);
116
+ if (!xparser)
117
+ rxml_raise(&xmlLastError);
118
+
119
+ return rxml_schema_init(class, xparser);
120
+ }
121
+
122
+ /*
123
+ * call-seq:
124
+ * XML::Schema.from_string("schema_data") -> "value"
125
+ *
126
+ * Create a new schema using the specified string.
127
+ */
128
+ static VALUE rxml_schema_init_from_string(VALUE class, VALUE schema_str)
129
+ {
130
+ xmlSchemaParserCtxtPtr xparser;
131
+
132
+ Check_Type(schema_str, T_STRING);
133
+
134
+ xmlResetLastError();
135
+ xparser = xmlSchemaNewMemParserCtxt(StringValuePtr(schema_str), (int)strlen(StringValuePtr(schema_str)));
136
+ if (!xparser)
137
+ rxml_raise(&xmlLastError);
138
+
139
+ return rxml_schema_init(class, xparser);
140
+ }
141
+
142
+ /*
143
+ * call-seq:
144
+ * XML::Schema.document -> document
145
+ *
146
+ * Return the Schema XML Document
147
+ */
148
+ static VALUE rxml_schema_document(VALUE self)
149
+ {
150
+ xmlSchemaPtr xschema;
151
+
152
+ Data_Get_Struct(self, xmlSchema, xschema);
153
+
154
+ return rxml_node_wrap(xmlDocGetRootElement(xschema->doc));
155
+ }
156
+
157
+ static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, const xmlChar *nsname)
158
+ {
159
+ xmlNodePtr xnode;
160
+ xmlNsPtr xns;
161
+
162
+ if (ximport->doc)
163
+ {
164
+ xnode = xmlDocGetRootElement(ximport->doc);
165
+ xns = xnode->nsDef;
166
+
167
+ while (xns)
168
+ {
169
+ VALUE namespace = rxml_namespace_wrap(xns);
170
+ rb_ary_push(array, namespace);
171
+ xns = xns->next;
172
+ }
173
+ }
174
+ }
175
+
176
+ /*
177
+ * call-seq:
178
+ * XML::Schema.namespaces -> array
179
+ *
180
+ * Returns an array of Namespaces defined by the schema
181
+ */
182
+ static VALUE rxml_schema_namespaces(VALUE self)
183
+ {
184
+ VALUE result;
185
+ xmlSchemaPtr xschema;
186
+
187
+ Data_Get_Struct(self, xmlSchema, xschema);
188
+
189
+ result = rb_ary_new();
190
+ xmlHashScan(xschema->schemasImports, (xmlHashScanner)scan_namespaces, (void *)result);
191
+
192
+ return result;
193
+ }
194
+
195
+ static void scan_schema_element(xmlSchemaElementPtr xelement, VALUE hash, const xmlChar *name)
196
+ {
197
+ VALUE element = rxml_wrap_schema_element(xelement);
198
+ rb_hash_aset(hash, rb_str_new2((const char*)name), element);
199
+ }
200
+
201
+ static VALUE rxml_schema_elements(VALUE self)
202
+ {
203
+ VALUE result = rb_hash_new();
204
+ xmlSchemaPtr xschema;
205
+
206
+ Data_Get_Struct(self, xmlSchema, xschema);
207
+ xmlHashScan(xschema->elemDecl, (xmlHashScanner)scan_schema_element, (void *)result);
208
+
209
+ return result;
210
+ }
211
+
212
+ static void collect_imported_ns_elements(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
213
+ {
214
+ if (import->imported && import->schema)
215
+ {
216
+ VALUE elements = rb_hash_new();
217
+ xmlHashScan(import->schema->elemDecl, (xmlHashScanner)scan_schema_element, (void *)elements);
218
+ rb_hash_aset(result, QNIL_OR_STRING(import->schema->targetNamespace), elements);
219
+ }
220
+ }
221
+
222
+ /*
223
+ * call-seq:
224
+ * XML::Schema.imported_ns_elements -> hash
225
+ *
226
+ * Returns a hash by namespace of a hash of schema elements within the entire schema including imports
227
+ */
228
+ static VALUE rxml_schema_imported_ns_elements(VALUE self)
229
+ {
230
+ xmlSchemaPtr xschema;
231
+ VALUE result = rb_hash_new();
232
+
233
+ Data_Get_Struct(self, xmlSchema, xschema);
234
+
235
+ if (xschema)
236
+ {
237
+ xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_ns_elements, (void *)result);
238
+ }
239
+
240
+ return result;
241
+ }
242
+
243
+ static void scan_schema_type(xmlSchemaTypePtr xtype, VALUE hash, const xmlChar *name)
244
+ {
245
+ VALUE type = rxml_wrap_schema_type(xtype);
246
+ rb_hash_aset(hash, rb_str_new2((const char*)name), type);
247
+ }
248
+
249
+ static VALUE rxml_schema_types(VALUE self)
250
+ {
251
+ VALUE result = rb_hash_new();
252
+ xmlSchemaPtr xschema;
253
+
254
+ Data_Get_Struct(self, xmlSchema, xschema);
255
+
256
+ if (xschema != NULL && xschema->typeDecl != NULL)
257
+ {
258
+ xmlHashScan(xschema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)result);
259
+ }
260
+
261
+ return result;
262
+ }
263
+
264
+ static void collect_imported_types(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
265
+ {
266
+ if (import->imported && import->schema)
267
+ {
268
+ xmlHashScan(import->schema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)result);
269
+ }
270
+ }
271
+
272
+ /*
273
+ * call-seq:
274
+ * XML::Schema.imported_types -> hash
275
+ *
276
+ * Returns a hash of all types within the entire schema including imports
277
+ */
278
+ static VALUE rxml_schema_imported_types(VALUE self)
279
+ {
280
+ xmlSchemaPtr xschema;
281
+ VALUE result = rb_hash_new();
282
+
283
+ Data_Get_Struct(self, xmlSchema, xschema);
284
+
285
+ if (xschema)
286
+ {
287
+ xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_types, (void *)result);
288
+ }
289
+
290
+ return result;
291
+ }
292
+
293
+ static void collect_imported_ns_types(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
294
+ {
295
+ if (import->imported && import->schema)
296
+ {
297
+ VALUE types = rb_hash_new();
298
+ xmlHashScan(import->schema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)types);
299
+ rb_hash_aset(result, QNIL_OR_STRING(import->schema->targetNamespace), types);
300
+ }
301
+ }
302
+
303
+ /*
304
+ * call-seq:
305
+ * XML::Schema.imported_ns_types -> hash
306
+ *
307
+ * Returns a hash by namespace of a hash of schema types within the entire schema including imports
308
+ */
309
+ static VALUE rxml_schema_imported_ns_types(VALUE self)
310
+ {
311
+ xmlSchemaPtr xschema;
312
+ VALUE result = rb_hash_new();
313
+
314
+ Data_Get_Struct(self, xmlSchema, xschema);
315
+
316
+ if (xschema)
317
+ {
318
+ xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_ns_types, (void *)result);
319
+ }
320
+
321
+ return result;
322
+ }
323
+
324
+ void rxml_init_schema(void)
325
+ {
326
+ cXMLSchema = rb_define_class_under(mXML, "Schema", rb_cObject);
327
+ rb_define_singleton_method(cXMLSchema, "new", rxml_schema_init_from_uri, 1);
328
+ rb_define_singleton_method(cXMLSchema, "from_string", rxml_schema_init_from_string, 1);
329
+ rb_define_singleton_method(cXMLSchema, "document", rxml_schema_init_from_document, 1);
330
+
331
+ /* Create attr_reader methods for the above instance variables */
332
+ rb_define_attr(cXMLSchema, "target_namespace", 1, 0);
333
+ rb_define_attr(cXMLSchema, "name", 1, 0);
334
+ rb_define_attr(cXMLSchema, "id", 1, 0);
335
+ rb_define_attr(cXMLSchema, "version", 1, 0);
336
+
337
+ // These are just methods so as to hide their values and not overly clutter the output of inspect/to_str
338
+ rb_define_method(cXMLSchema, "document", rxml_schema_document, 0);
339
+ rb_define_method(cXMLSchema, "namespaces", rxml_schema_namespaces, 0);
340
+ rb_define_method(cXMLSchema, "elements", rxml_schema_elements, 0);
341
+ rb_define_method(cXMLSchema, "imported_ns_elements", rxml_schema_imported_ns_elements, 0);
342
+ rb_define_method(cXMLSchema, "types", rxml_schema_types, 0);
343
+ rb_define_method(cXMLSchema, "imported_types", rxml_schema_imported_types, 0);
344
+ rb_define_method(cXMLSchema, "imported_ns_types", rxml_schema_imported_ns_types, 0);
345
+
346
+ rxml_init_schema_facet();
347
+ rxml_init_schema_element();
348
+ rxml_init_schema_attribute();
349
+ rxml_init_schema_type();
350
+ }