libxml-ruby 2.8.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +842 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +90 -78
  7. data/ext/libxml/extconf.h +3 -0
  8. data/ext/libxml/extconf.rb +61 -116
  9. data/ext/libxml/libxml.c +80 -76
  10. data/ext/libxml/ruby_libxml.h +67 -75
  11. data/ext/libxml/ruby_xml.c +933 -893
  12. data/ext/libxml/ruby_xml.h +10 -10
  13. data/ext/libxml/ruby_xml_attr.c +333 -333
  14. data/ext/libxml/ruby_xml_attr.h +12 -12
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  17. data/ext/libxml/ruby_xml_attributes.c +275 -275
  18. data/ext/libxml/ruby_xml_attributes.h +15 -15
  19. data/ext/libxml/ruby_xml_cbg.c +85 -85
  20. data/ext/libxml/ruby_xml_document.c +1123 -1147
  21. data/ext/libxml/ruby_xml_document.h +11 -11
  22. data/ext/libxml/ruby_xml_dtd.c +248 -268
  23. data/ext/libxml/ruby_xml_dtd.h +9 -9
  24. data/ext/libxml/ruby_xml_encoding.c +250 -260
  25. data/ext/libxml/ruby_xml_encoding.h +16 -19
  26. data/ext/libxml/ruby_xml_error.c +996 -996
  27. data/ext/libxml/ruby_xml_error.h +12 -12
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  36. data/ext/libxml/ruby_xml_io.c +47 -50
  37. data/ext/libxml/ruby_xml_io.h +10 -10
  38. data/ext/libxml/ruby_xml_namespace.c +153 -153
  39. data/ext/libxml/ruby_xml_namespace.h +10 -10
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  42. data/ext/libxml/ruby_xml_node.c +1402 -1452
  43. data/ext/libxml/ruby_xml_node.h +13 -11
  44. data/ext/libxml/ruby_xml_parser.c +91 -94
  45. data/ext/libxml/ruby_xml_parser.h +12 -12
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  50. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  51. data/ext/libxml/ruby_xml_reader.h +17 -17
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  58. data/ext/libxml/ruby_xml_schema.c +278 -301
  59. data/ext/libxml/ruby_xml_schema.h +809 -809
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -94
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -259
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  68. data/ext/libxml/ruby_xml_version.h +9 -9
  69. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  70. data/ext/libxml/ruby_xml_writer.h +10 -10
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  73. data/ext/libxml/ruby_xml_xpath.c +194 -188
  74. data/ext/libxml/ruby_xml_xpath.h +13 -13
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  83. data/ext/vc/libxml_ruby.sln +17 -15
  84. data/lib/libxml-ruby.rb +30 -0
  85. data/lib/libxml.rb +3 -33
  86. data/lib/libxml/node.rb +2 -78
  87. data/lib/libxml/parser.rb +0 -266
  88. data/lib/libxml/sax_parser.rb +0 -17
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml/schema/attribute.rb +19 -19
  91. data/lib/libxml/schema/element.rb +19 -27
  92. data/lib/libxml/schema/type.rb +21 -29
  93. data/libxml-ruby.gemspec +48 -44
  94. data/script/benchmark/depixelate +634 -634
  95. data/script/benchmark/hamlet.xml +9054 -9054
  96. data/script/benchmark/parsecount +170 -170
  97. data/script/benchmark/throughput +41 -41
  98. data/script/test +6 -6
  99. data/setup.rb +0 -1
  100. data/test/c14n/given/example-1.xml +14 -14
  101. data/test/c14n/given/example-2.xml +11 -11
  102. data/test/c14n/given/example-3.xml +18 -18
  103. data/test/c14n/given/example-4.xml +9 -9
  104. data/test/c14n/given/example-5.xml +12 -12
  105. data/test/c14n/given/example-6.xml +2 -2
  106. data/test/c14n/given/example-7.xml +11 -11
  107. data/test/c14n/given/example-8.xml +11 -11
  108. data/test/c14n/given/example-8.xpath +9 -9
  109. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  110. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  111. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  112. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  113. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  114. data/test/c14n/result/with-comments/example-1 +5 -5
  115. data/test/c14n/result/with-comments/example-2 +10 -10
  116. data/test/c14n/result/with-comments/example-3 +13 -13
  117. data/test/c14n/result/with-comments/example-4 +8 -8
  118. data/test/c14n/result/with-comments/example-5 +3 -3
  119. data/test/c14n/result/without-comments/example-1 +3 -3
  120. data/test/c14n/result/without-comments/example-2 +10 -10
  121. data/test/c14n/result/without-comments/example-3 +13 -13
  122. data/test/c14n/result/without-comments/example-4 +8 -8
  123. data/test/c14n/result/without-comments/example-5 +2 -2
  124. data/test/model/atom.xml +12 -12
  125. data/test/model/bands.iso-8859-1.xml +4 -4
  126. data/test/model/bands.utf-8.xml +4 -4
  127. data/test/model/bands.xml +4 -4
  128. data/test/model/books.xml +153 -153
  129. data/test/model/cwm_1_0.xml +11336 -0
  130. data/test/model/merge_bug_data.xml +58 -58
  131. data/test/model/ruby-lang.html +238 -238
  132. data/test/model/rubynet.xml +79 -79
  133. data/test/model/shiporder.rnc +28 -28
  134. data/test/model/shiporder.rng +86 -86
  135. data/test/model/shiporder.xml +22 -22
  136. data/test/model/shiporder.xsd +39 -39
  137. data/test/model/soap.xml +27 -27
  138. data/test/model/xinclude.xml +4 -4
  139. data/test/test.xml +2 -0
  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} +32 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +28 -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 +3 -10
  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} +41 -42
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +363 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +36 -37
  171. data/test/{tc_schema.rb → test_schema.rb} +43 -37
  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 +262 -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 +117 -95
  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_xml.rb +0 -226
  204. data/test/tc_xpath_expression.rb +0 -38
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_SAX2_HANDLER__
4
- #define __RXML_SAX2_HANDLER__
5
-
6
- extern xmlSAXHandler rxml_sax_handler;
7
-
8
- void rxml_init_sax2_handler(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_SAX2_HANDLER__
4
+ #define __RXML_SAX2_HANDLER__
5
+
6
+ extern xmlSAXHandler rxml_sax_handler;
7
+
8
+ void rxml_init_sax2_handler(void);
9
+
10
+ #endif
@@ -1,120 +1,116 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "ruby_libxml.h"
4
- #include "ruby_xml_sax_parser.h"
5
-
6
- /*
7
- * Document-class: LibXML::XML::SaxParser
8
- *
9
- * XML::SaxParser provides a callback based API for parsing documents,
10
- * in contrast to XML::Parser's tree based API and XML::Reader's stream
11
- * based API.
12
- *
13
- * The XML::SaxParser API is fairly complex, not well standardized,
14
- * and does not directly support validation making entity, namespace and
15
- * base processing relatively hard.
16
- *
17
- * To use the XML::SaxParser, register a callback class via the
18
- * XML::SaxParser#callbacks=. It is easiest to include the
19
- * XML::SaxParser::Callbacks module in your class and override
20
- * the methods as needed.
21
- *
22
- * Basic example:
23
- *
24
- * class MyCallbacks
25
- * include XML::SaxParser::Callbacks
26
- * def on_start_element(element, attributes)
27
- * puts #Element started: #{element}"
28
- * end
29
- * end
30
- *
31
- * parser = XML::SaxParser.string(my_string)
32
- * parser.callbacks = MyCallbacks.new
33
- * parser.parse
34
- *
35
- * You can also parse strings (see XML::SaxParser.string) and
36
- * io objects (see XML::SaxParser.io).
37
- */
38
-
39
- VALUE cXMLSaxParser;
40
- static ID CALLBACKS_ATTR;
41
- static ID CONTEXT_ATTR;
42
-
43
-
44
- /* ====== Parser =========== */
45
-
46
- /*
47
- * call-seq:
48
- * parser.initialize(context) -> XML::Parser
49
- *
50
- * Creates a new XML::Parser from the specified
51
- * XML::Parser::Context.
52
- */
53
- static VALUE rxml_sax_parser_initialize(int argc, VALUE *argv, VALUE self)
54
- {
55
- VALUE context = Qnil;
56
-
57
- rb_scan_args(argc, argv, "01", &context);
58
-
59
- if (context == Qnil)
60
- {
61
- rb_warn("Passing no parameters to XML::SaxParser.new is deprecated. Pass an instance of XML::Parser::Context instead.");
62
- context = rb_class_new_instance(0, NULL, cXMLParserContext);
63
- }
64
-
65
- rb_ivar_set(self, CONTEXT_ATTR, context);
66
- return self;
67
- }
68
-
69
- /*
70
- * call-seq:
71
- * parser.parse -> (true|false)
72
- *
73
- * Parse the input XML, generating callbacks to the object
74
- * registered via the +callbacks+ attributesibute.
75
- */
76
- static VALUE rxml_sax_parser_parse(VALUE self)
77
- {
78
- int status;
79
- VALUE context = rb_ivar_get(self, CONTEXT_ATTR);
80
- xmlParserCtxtPtr ctxt;
81
- Data_Get_Struct(context, xmlParserCtxt, ctxt);
82
-
83
- ctxt->sax2 = 1;
84
- ctxt->userData = (void*)rb_ivar_get(self, CALLBACKS_ATTR);
85
-
86
- if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)
87
- xmlFree(ctxt->sax);
88
-
89
- ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(rxml_sax_handler));
90
- if (ctxt->sax == NULL)
91
- rb_fatal("Not enough memory.");
92
- memcpy(ctxt->sax, &rxml_sax_handler, sizeof(rxml_sax_handler));
93
-
94
- status = xmlParseDocument(ctxt);
95
-
96
- /* Now check the parsing result*/
97
- if (status == -1 || !ctxt->wellFormed)
98
- {
99
- if (ctxt->myDoc)
100
- xmlFreeDoc(ctxt->myDoc);
101
-
102
- rxml_raise(&ctxt->lastError);
103
- }
104
- return Qtrue;
105
- }
106
-
107
- void rxml_init_sax_parser(void)
108
- {
109
- /* SaxParser */
110
- cXMLSaxParser = rb_define_class_under(mXML, "SaxParser", rb_cObject);
111
-
112
- /* Atributes */
113
- CALLBACKS_ATTR = rb_intern("@callbacks");
114
- CONTEXT_ATTR = rb_intern("@context");
115
- rb_define_attr(cXMLSaxParser, "callbacks", 1, 1);
116
-
117
- /* Instance Methods */
118
- rb_define_method(cXMLSaxParser, "initialize", rxml_sax_parser_initialize, -1);
119
- rb_define_method(cXMLSaxParser, "parse", rxml_sax_parser_parse, 0);
120
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include "ruby_xml_sax_parser.h"
5
+
6
+ /*
7
+ * Document-class: LibXML::XML::SaxParser
8
+ *
9
+ * XML::SaxParser provides a callback based API for parsing documents,
10
+ * in contrast to XML::Parser's tree based API and XML::Reader's stream
11
+ * based API.
12
+ *
13
+ * The XML::SaxParser API is fairly complex, not well standardized,
14
+ * and does not directly support validation making entity, namespace and
15
+ * base processing relatively hard.
16
+ *
17
+ * To use the XML::SaxParser, register a callback class via the
18
+ * XML::SaxParser#callbacks=. It is easiest to include the
19
+ * XML::SaxParser::Callbacks module in your class and override
20
+ * the methods as needed.
21
+ *
22
+ * Basic example:
23
+ *
24
+ * class MyCallbacks
25
+ * include XML::SaxParser::Callbacks
26
+ * def on_start_element(element, attributes)
27
+ * puts #Element started: #{element}"
28
+ * end
29
+ * end
30
+ *
31
+ * parser = XML::SaxParser.string(my_string)
32
+ * parser.callbacks = MyCallbacks.new
33
+ * parser.parse
34
+ *
35
+ * You can also parse strings (see XML::SaxParser.string) and
36
+ * io objects (see XML::SaxParser.io).
37
+ */
38
+
39
+ VALUE cXMLSaxParser;
40
+ static ID CALLBACKS_ATTR;
41
+ static ID CONTEXT_ATTR;
42
+
43
+
44
+ /* ====== Parser =========== */
45
+
46
+ /*
47
+ * call-seq:
48
+ * parser.initialize(context) -> XML::Parser
49
+ *
50
+ * Creates a new XML::Parser from the specified
51
+ * XML::Parser::Context.
52
+ */
53
+ static VALUE rxml_sax_parser_initialize(int argc, VALUE *argv, VALUE self)
54
+ {
55
+ VALUE context = Qnil;
56
+
57
+ rb_scan_args(argc, argv, "01", &context);
58
+
59
+ if (context == Qnil)
60
+ {
61
+ rb_raise(rb_eArgError, "An instance of a XML::Parser::Context must be passed to XML::SaxParser.new");
62
+ }
63
+
64
+ rb_ivar_set(self, CONTEXT_ATTR, context);
65
+ return self;
66
+ }
67
+
68
+ /*
69
+ * call-seq:
70
+ * parser.parse -> (true|false)
71
+ *
72
+ * Parse the input XML, generating callbacks to the object
73
+ * registered via the +callbacks+ attributesibute.
74
+ */
75
+ static VALUE rxml_sax_parser_parse(VALUE self)
76
+ {
77
+ int status;
78
+ VALUE context = rb_ivar_get(self, CONTEXT_ATTR);
79
+ xmlParserCtxtPtr ctxt;
80
+ Data_Get_Struct(context, xmlParserCtxt, ctxt);
81
+
82
+ ctxt->sax2 = 1;
83
+ ctxt->userData = (void*)rb_ivar_get(self, CALLBACKS_ATTR);
84
+
85
+ if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)
86
+ xmlFree(ctxt->sax);
87
+
88
+ ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(rxml_sax_handler));
89
+ if (ctxt->sax == NULL)
90
+ rb_fatal("Not enough memory.");
91
+ memcpy(ctxt->sax, &rxml_sax_handler, sizeof(rxml_sax_handler));
92
+
93
+ status = xmlParseDocument(ctxt);
94
+
95
+ /* Now check the parsing result*/
96
+ if (status == -1 || !ctxt->wellFormed)
97
+ {
98
+ rxml_raise(&ctxt->lastError);
99
+ }
100
+ return Qtrue;
101
+ }
102
+
103
+ void rxml_init_sax_parser(void)
104
+ {
105
+ /* SaxParser */
106
+ cXMLSaxParser = rb_define_class_under(mXML, "SaxParser", rb_cObject);
107
+
108
+ /* Atributes */
109
+ CALLBACKS_ATTR = rb_intern("@callbacks");
110
+ CONTEXT_ATTR = rb_intern("@context");
111
+ rb_define_attr(cXMLSaxParser, "callbacks", 1, 1);
112
+
113
+ /* Instance Methods */
114
+ rb_define_method(cXMLSaxParser, "initialize", rxml_sax_parser_initialize, -1);
115
+ rb_define_method(cXMLSaxParser, "parse", rxml_sax_parser_parse, 0);
116
+ }
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_SAX_PARSER__
4
- #define __RXML_SAX_PARSER__
5
-
6
- extern VALUE cXMLSaxParser;
7
-
8
- void rxml_init_sax_parser(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_SAX_PARSER__
4
+ #define __RXML_SAX_PARSER__
5
+
6
+ extern VALUE cXMLSaxParser;
7
+
8
+ void rxml_init_sax_parser(void);
9
+
10
+ #endif
@@ -1,301 +1,278 @@
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
+ return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
50
+ }
51
+
52
+
53
+ /*
54
+ * call-seq:
55
+ * XML::Schema.initialize(schema_uri) -> schema
56
+ *
57
+ * Create a new schema from the specified URI.
58
+ */
59
+ static VALUE rxml_schema_init_from_uri(VALUE class, VALUE uri)
60
+ {
61
+ xmlSchemaParserCtxtPtr xparser;
62
+ xmlSchemaPtr xschema;
63
+
64
+ Check_Type(uri, T_STRING);
65
+
66
+ xparser = xmlSchemaNewParserCtxt(StringValuePtr(uri));
67
+ xschema = xmlSchemaParse(xparser);
68
+ xmlSchemaFreeParserCtxt(xparser);
69
+
70
+ return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
71
+ }
72
+
73
+ /*
74
+ * call-seq:
75
+ * XML::Schema.document(document) -> schema
76
+ *
77
+ * Create a new schema from the specified document.
78
+ */
79
+ static VALUE rxml_schema_init_from_document(VALUE class, VALUE document)
80
+ {
81
+ xmlDocPtr xdoc;
82
+ xmlSchemaPtr xschema;
83
+ xmlSchemaParserCtxtPtr xparser;
84
+
85
+ Data_Get_Struct(document, xmlDoc, xdoc);
86
+
87
+ xparser = xmlSchemaNewDocParserCtxt(xdoc);
88
+ xschema = xmlSchemaParse(xparser);
89
+ xmlSchemaFreeParserCtxt(xparser);
90
+
91
+ if (xschema == NULL)
92
+ return Qnil;
93
+
94
+ return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
95
+ }
96
+
97
+ /*
98
+ * call-seq:
99
+ * XML::Schema.from_string("schema_data") -> "value"
100
+ *
101
+ * Create a new schema using the specified string.
102
+ */
103
+ static VALUE rxml_schema_init_from_string(VALUE self, VALUE schema_str)
104
+ {
105
+ xmlSchemaParserCtxtPtr xparser;
106
+ xmlSchemaPtr xschema;
107
+
108
+ Check_Type(schema_str, T_STRING);
109
+
110
+ xparser = xmlSchemaNewMemParserCtxt(StringValuePtr(schema_str), (int)strlen(StringValuePtr(schema_str)));
111
+ xschema = xmlSchemaParse(xparser);
112
+ xmlSchemaFreeParserCtxt(xparser);
113
+
114
+ return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
115
+ }
116
+
117
+
118
+ static VALUE rxml_schema_target_namespace(VALUE self)
119
+ {
120
+ xmlSchemaPtr xschema;
121
+
122
+ Data_Get_Struct(self, xmlSchema, xschema);
123
+
124
+ QNIL_OR_STRING(xschema->targetNamespace)
125
+ }
126
+
127
+ static VALUE rxml_schema_name(VALUE self)
128
+ {
129
+ xmlSchemaPtr xschema;
130
+
131
+ Data_Get_Struct(self, xmlSchema, xschema);
132
+
133
+ QNIL_OR_STRING(xschema->name)
134
+ }
135
+
136
+ static VALUE rxml_schema_version(VALUE self)
137
+ {
138
+ xmlSchemaPtr xschema;
139
+
140
+ Data_Get_Struct(self, xmlSchema, xschema);
141
+
142
+ QNIL_OR_STRING(xschema->version)
143
+ }
144
+
145
+ static VALUE rxml_schema_id(VALUE self)
146
+ {
147
+ xmlSchemaPtr xschema;
148
+
149
+ Data_Get_Struct(self, xmlSchema, xschema);
150
+
151
+ QNIL_OR_STRING(xschema->id)
152
+ }
153
+
154
+ static VALUE rxml_schema_document(VALUE self)
155
+ {
156
+ xmlSchemaPtr xschema;
157
+
158
+ Data_Get_Struct(self, xmlSchema, xschema);
159
+
160
+ return rxml_node_wrap(xmlDocGetRootElement(xschema->doc));
161
+ }
162
+
163
+ static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, xmlChar *nsname)
164
+ {
165
+ xmlNodePtr xnode;
166
+ xmlNsPtr xns;
167
+
168
+ if (ximport->doc)
169
+ {
170
+ xnode = xmlDocGetRootElement(ximport->doc);
171
+ xns = xnode->nsDef;
172
+
173
+ while (xns)
174
+ {
175
+ VALUE namespace = rxml_namespace_wrap(xns);
176
+ rb_ary_push(array, namespace);
177
+ xns = xns->next;
178
+ }
179
+ }
180
+ }
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_element(xmlSchemaElementPtr xelement, VALUE hash, 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_element, (void *)result);
208
+
209
+ return result;
210
+ }
211
+
212
+ static void scan_type(xmlSchemaTypePtr xtype, VALUE hash, xmlChar *name)
213
+ {
214
+ VALUE type = rxml_wrap_schema_type(xtype);
215
+ rb_hash_aset(hash, rb_str_new2((const char*)name), type);
216
+ }
217
+
218
+ static VALUE rxml_schema_types(VALUE self)
219
+ {
220
+ VALUE result = rb_hash_new();
221
+ xmlSchemaPtr xschema;
222
+
223
+ Data_Get_Struct(self, xmlSchema, xschema);
224
+
225
+ if (xschema != NULL && xschema->typeDecl != NULL)
226
+ {
227
+ xmlHashScan(xschema->typeDecl, (xmlHashScanner)scan_type, (void *)result);
228
+ }
229
+
230
+ return result;
231
+ }
232
+
233
+ static void collect_imported_types(xmlSchemaImportPtr import, VALUE result)
234
+ {
235
+ if (import->imported && import->schema)
236
+ {
237
+ xmlHashScan(import->schema->typeDecl, (xmlHashScanner)scan_type, (void *)result);
238
+ }
239
+ }
240
+
241
+ static VALUE rxml_schema_imported_types(VALUE self)
242
+ {
243
+ xmlSchemaPtr xschema;
244
+ VALUE result = rb_hash_new();
245
+
246
+ Data_Get_Struct(self, xmlSchema, xschema);
247
+
248
+ if (xschema)
249
+ {
250
+ xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_types, (void *)result);
251
+ }
252
+
253
+ return result;
254
+ }
255
+
256
+ void rxml_init_schema(void)
257
+ {
258
+ cXMLSchema = rb_define_class_under(mXML, "Schema", rb_cObject);
259
+ rb_define_singleton_method(cXMLSchema, "new", rxml_schema_init_from_uri, 1);
260
+ rb_define_singleton_method(cXMLSchema, "from_string", rxml_schema_init_from_string, 1);
261
+ rb_define_singleton_method(cXMLSchema, "document", rxml_schema_init_from_document, 1);
262
+
263
+ rb_define_method(cXMLSchema, "target_namespace", rxml_schema_target_namespace, 0);
264
+ rb_define_method(cXMLSchema, "name", rxml_schema_name, 0);
265
+ rb_define_method(cXMLSchema, "id", rxml_schema_id, 0);
266
+ rb_define_method(cXMLSchema, "version", rxml_schema_version, 0);
267
+ rb_define_method(cXMLSchema, "document", rxml_schema_document, 0);
268
+
269
+ rb_define_method(cXMLSchema, "elements", rxml_schema_elements, 0);
270
+ rb_define_method(cXMLSchema, "imported_types", rxml_schema_imported_types, 0);
271
+ rb_define_method(cXMLSchema, "namespaces", rxml_schema_namespaces, 0);
272
+ rb_define_method(cXMLSchema, "types", rxml_schema_types, 0);
273
+
274
+ rxml_init_schema_facet();
275
+ rxml_init_schema_element();
276
+ rxml_init_schema_attribute();
277
+ rxml_init_schema_type();
278
+ }