coupa-libxml-ruby 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. data/CHANGES +488 -0
  2. data/LICENSE +22 -0
  3. data/README +161 -0
  4. data/Rakefile +188 -0
  5. data/doc/css/normal.css +182 -0
  6. data/doc/img/raze-tiny.png +0 -0
  7. data/doc/img/red-cube.jpg +0 -0
  8. data/doc/img/xml-ruby.png +0 -0
  9. data/doc/index.xml +43 -0
  10. data/doc/install.xml +77 -0
  11. data/doc/layout.rhtml +38 -0
  12. data/doc/layout.xsl +67 -0
  13. data/doc/license.xml +32 -0
  14. data/doc/log/changelog.xml +1324 -0
  15. data/doc/log/changelog.xsl +42 -0
  16. data/doc/rdoc/classes/LibXML.html +207 -0
  17. data/doc/rdoc/classes/LibXML/XML.html +407 -0
  18. data/doc/rdoc/classes/LibXML/XML/Attr.html +521 -0
  19. data/doc/rdoc/classes/LibXML/XML/AttrDecl.html +360 -0
  20. data/doc/rdoc/classes/LibXML/XML/Attributes.html +149 -0
  21. data/doc/rdoc/classes/LibXML/XML/Document.html +460 -0
  22. data/doc/rdoc/classes/LibXML/XML/Error.html +129 -0
  23. data/doc/rdoc/classes/LibXML/XML/HTMLParser.html +263 -0
  24. data/doc/rdoc/classes/LibXML/XML/Namespace.html +248 -0
  25. data/doc/rdoc/classes/LibXML/XML/Namespaces.html +200 -0
  26. data/doc/rdoc/classes/LibXML/XML/Node.html +1351 -0
  27. data/doc/rdoc/classes/LibXML/XML/Parser.html +328 -0
  28. data/doc/rdoc/classes/LibXML/XML/Reader.html +172 -0
  29. data/doc/rdoc/classes/LibXML/XML/SaxParser.html +232 -0
  30. data/doc/rdoc/classes/LibXML/XML/SaxParser/Callbacks.html +506 -0
  31. data/doc/rdoc/classes/LibXML/XML/SaxParser/VerboseCallbacks.html +555 -0
  32. data/doc/rdoc/classes/LibXML/XML/XPath.html +111 -0
  33. data/doc/rdoc/classes/LibXML/XML/XPath/Object.html +162 -0
  34. data/doc/rdoc/classes/cXMLDtd.html +114 -0
  35. data/doc/rdoc/classes/cXMLNode.html +114 -0
  36. data/doc/rdoc/created.rid +1 -0
  37. data/doc/rdoc/files/CHANGES.html +794 -0
  38. data/doc/rdoc/files/LICENSE.html +131 -0
  39. data/doc/rdoc/files/README.html +343 -0
  40. data/doc/rdoc/files/ext/libxml/libxml_c.html +101 -0
  41. data/doc/rdoc/files/ext/libxml/ruby_xml_attr_c.html +101 -0
  42. data/doc/rdoc/files/ext/libxml/ruby_xml_attr_decl_c.html +101 -0
  43. data/doc/rdoc/files/ext/libxml/ruby_xml_attributes_c.html +101 -0
  44. data/doc/rdoc/files/ext/libxml/ruby_xml_c.html +101 -0
  45. data/doc/rdoc/files/ext/libxml/ruby_xml_cbg_c.html +101 -0
  46. data/doc/rdoc/files/ext/libxml/ruby_xml_document_c.html +101 -0
  47. data/doc/rdoc/files/ext/libxml/ruby_xml_dtd_c.html +101 -0
  48. data/doc/rdoc/files/ext/libxml/ruby_xml_encoding_c.html +101 -0
  49. data/doc/rdoc/files/ext/libxml/ruby_xml_error_c.html +101 -0
  50. data/doc/rdoc/files/ext/libxml/ruby_xml_html_parser_c.html +101 -0
  51. data/doc/rdoc/files/ext/libxml/ruby_xml_html_parser_context_c.html +101 -0
  52. data/doc/rdoc/files/ext/libxml/ruby_xml_html_parser_options_c.html +101 -0
  53. data/doc/rdoc/files/ext/libxml/ruby_xml_input_cbg_c.html +101 -0
  54. data/doc/rdoc/files/ext/libxml/ruby_xml_io_c.html +101 -0
  55. data/doc/rdoc/files/ext/libxml/ruby_xml_namespace_c.html +101 -0
  56. data/doc/rdoc/files/ext/libxml/ruby_xml_namespaces_c.html +101 -0
  57. data/doc/rdoc/files/ext/libxml/ruby_xml_node_c.html +101 -0
  58. data/doc/rdoc/files/ext/libxml/ruby_xml_parser_c.html +101 -0
  59. data/doc/rdoc/files/ext/libxml/ruby_xml_parser_context_c.html +101 -0
  60. data/doc/rdoc/files/ext/libxml/ruby_xml_parser_options_c.html +101 -0
  61. data/doc/rdoc/files/ext/libxml/ruby_xml_reader_c.html +101 -0
  62. data/doc/rdoc/files/ext/libxml/ruby_xml_relaxng_c.html +101 -0
  63. data/doc/rdoc/files/ext/libxml/ruby_xml_sax2_handler_c.html +101 -0
  64. data/doc/rdoc/files/ext/libxml/ruby_xml_sax_parser_c.html +101 -0
  65. data/doc/rdoc/files/ext/libxml/ruby_xml_schema_c.html +101 -0
  66. data/doc/rdoc/files/ext/libxml/ruby_xml_xinclude_c.html +101 -0
  67. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_c.html +101 -0
  68. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_context_c.html +101 -0
  69. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_expression_c.html +101 -0
  70. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_object_c.html +101 -0
  71. data/doc/rdoc/files/ext/libxml/ruby_xml_xpointer_c.html +101 -0
  72. data/doc/rdoc/files/lib/libxml/attr_decl_rb.html +101 -0
  73. data/doc/rdoc/files/lib/libxml/attr_rb.html +101 -0
  74. data/doc/rdoc/files/lib/libxml/attributes_rb.html +101 -0
  75. data/doc/rdoc/files/lib/libxml/document_rb.html +101 -0
  76. data/doc/rdoc/files/lib/libxml/error_rb.html +101 -0
  77. data/doc/rdoc/files/lib/libxml/hpricot_rb.html +192 -0
  78. data/doc/rdoc/files/lib/libxml/html_parser_rb.html +101 -0
  79. data/doc/rdoc/files/lib/libxml/namespace_rb.html +101 -0
  80. data/doc/rdoc/files/lib/libxml/namespaces_rb.html +101 -0
  81. data/doc/rdoc/files/lib/libxml/node_rb.html +108 -0
  82. data/doc/rdoc/files/lib/libxml/ns_rb.html +101 -0
  83. data/doc/rdoc/files/lib/libxml/parser_rb.html +101 -0
  84. data/doc/rdoc/files/lib/libxml/properties_rb.html +101 -0
  85. data/doc/rdoc/files/lib/libxml/reader_rb.html +101 -0
  86. data/doc/rdoc/files/lib/libxml/sax_callbacks_rb.html +101 -0
  87. data/doc/rdoc/files/lib/libxml/sax_parser_rb.html +101 -0
  88. data/doc/rdoc/files/lib/libxml/tree_rb.html +101 -0
  89. data/doc/rdoc/files/lib/libxml/xpath_object_rb.html +101 -0
  90. data/doc/rdoc/files/lib/libxml_rb.html +133 -0
  91. data/doc/rdoc/files/lib/xml/libxml_rb.html +124 -0
  92. data/doc/rdoc/files/lib/xml_rb.html +134 -0
  93. data/doc/rdoc/fr_class_index.html +46 -0
  94. data/doc/rdoc/fr_file_index.html +84 -0
  95. data/doc/rdoc/fr_method_index.html +155 -0
  96. data/doc/rdoc/index.html +24 -0
  97. data/doc/rdoc/rdoc-style.css +208 -0
  98. data/ext/libxml/Makefile +157 -0
  99. data/ext/libxml/build.log +4 -0
  100. data/ext/libxml/extconf.h +5 -0
  101. data/ext/libxml/extconf.rb +278 -0
  102. data/ext/libxml/libxml.c +77 -0
  103. data/ext/libxml/libxml.o +0 -0
  104. data/ext/libxml/libxml_ruby.bundle +0 -0
  105. data/ext/libxml/mkmf.log +228 -0
  106. data/ext/libxml/ruby_libxml.h +93 -0
  107. data/ext/libxml/ruby_xml.c +893 -0
  108. data/ext/libxml/ruby_xml.h +10 -0
  109. data/ext/libxml/ruby_xml.o +0 -0
  110. data/ext/libxml/ruby_xml_attr.c +352 -0
  111. data/ext/libxml/ruby_xml_attr.h +14 -0
  112. data/ext/libxml/ruby_xml_attr.o +0 -0
  113. data/ext/libxml/ruby_xml_attr_decl.c +171 -0
  114. data/ext/libxml/ruby_xml_attr_decl.h +13 -0
  115. data/ext/libxml/ruby_xml_attr_decl.o +0 -0
  116. data/ext/libxml/ruby_xml_attributes.c +277 -0
  117. data/ext/libxml/ruby_xml_attributes.h +17 -0
  118. data/ext/libxml/ruby_xml_attributes.o +0 -0
  119. data/ext/libxml/ruby_xml_cbg.c +86 -0
  120. data/ext/libxml/ruby_xml_cbg.o +0 -0
  121. data/ext/libxml/ruby_xml_document.c +1006 -0
  122. data/ext/libxml/ruby_xml_document.c.old +936 -0
  123. data/ext/libxml/ruby_xml_document.h +17 -0
  124. data/ext/libxml/ruby_xml_document.o +0 -0
  125. data/ext/libxml/ruby_xml_dtd.c +257 -0
  126. data/ext/libxml/ruby_xml_dtd.h +9 -0
  127. data/ext/libxml/ruby_xml_dtd.o +0 -0
  128. data/ext/libxml/ruby_xml_encoding.c +134 -0
  129. data/ext/libxml/ruby_xml_encoding.h +12 -0
  130. data/ext/libxml/ruby_xml_encoding.o +0 -0
  131. data/ext/libxml/ruby_xml_error.c +1004 -0
  132. data/ext/libxml/ruby_xml_error.h +14 -0
  133. data/ext/libxml/ruby_xml_error.o +0 -0
  134. data/ext/libxml/ruby_xml_html_parser.c +92 -0
  135. data/ext/libxml/ruby_xml_html_parser.h +12 -0
  136. data/ext/libxml/ruby_xml_html_parser.o +0 -0
  137. data/ext/libxml/ruby_xml_html_parser_context.c +308 -0
  138. data/ext/libxml/ruby_xml_html_parser_context.h +12 -0
  139. data/ext/libxml/ruby_xml_html_parser_context.o +0 -0
  140. data/ext/libxml/ruby_xml_html_parser_options.c +40 -0
  141. data/ext/libxml/ruby_xml_html_parser_options.h +12 -0
  142. data/ext/libxml/ruby_xml_html_parser_options.o +0 -0
  143. data/ext/libxml/ruby_xml_input_cbg.c +191 -0
  144. data/ext/libxml/ruby_xml_input_cbg.h +20 -0
  145. data/ext/libxml/ruby_xml_input_cbg.o +0 -0
  146. data/ext/libxml/ruby_xml_io.c +30 -0
  147. data/ext/libxml/ruby_xml_io.h +9 -0
  148. data/ext/libxml/ruby_xml_io.o +0 -0
  149. data/ext/libxml/ruby_xml_namespace.c +170 -0
  150. data/ext/libxml/ruby_xml_namespace.h +12 -0
  151. data/ext/libxml/ruby_xml_namespace.o +0 -0
  152. data/ext/libxml/ruby_xml_namespaces.c +295 -0
  153. data/ext/libxml/ruby_xml_namespaces.h +11 -0
  154. data/ext/libxml/ruby_xml_namespaces.o +0 -0
  155. data/ext/libxml/ruby_xml_node.c +1386 -0
  156. data/ext/libxml/ruby_xml_node.h +13 -0
  157. data/ext/libxml/ruby_xml_node.o +0 -0
  158. data/ext/libxml/ruby_xml_parser.c +94 -0
  159. data/ext/libxml/ruby_xml_parser.h +14 -0
  160. data/ext/libxml/ruby_xml_parser.o +0 -0
  161. data/ext/libxml/ruby_xml_parser_context.c +982 -0
  162. data/ext/libxml/ruby_xml_parser_context.h +12 -0
  163. data/ext/libxml/ruby_xml_parser_context.o +0 -0
  164. data/ext/libxml/ruby_xml_parser_options.c +68 -0
  165. data/ext/libxml/ruby_xml_parser_options.h +14 -0
  166. data/ext/libxml/ruby_xml_parser_options.o +0 -0
  167. data/ext/libxml/ruby_xml_reader.c +1002 -0
  168. data/ext/libxml/ruby_xml_reader.h +14 -0
  169. data/ext/libxml/ruby_xml_reader.o +0 -0
  170. data/ext/libxml/ruby_xml_relaxng.c +111 -0
  171. data/ext/libxml/ruby_xml_relaxng.h +10 -0
  172. data/ext/libxml/ruby_xml_relaxng.o +0 -0
  173. data/ext/libxml/ruby_xml_sax2_handler.c +322 -0
  174. data/ext/libxml/ruby_xml_sax2_handler.h +12 -0
  175. data/ext/libxml/ruby_xml_sax2_handler.o +0 -0
  176. data/ext/libxml/ruby_xml_sax_parser.c +137 -0
  177. data/ext/libxml/ruby_xml_sax_parser.h +12 -0
  178. data/ext/libxml/ruby_xml_sax_parser.o +0 -0
  179. data/ext/libxml/ruby_xml_schema.c +159 -0
  180. data/ext/libxml/ruby_xml_schema.h +11 -0
  181. data/ext/libxml/ruby_xml_schema.o +0 -0
  182. data/ext/libxml/ruby_xml_version.h +9 -0
  183. data/ext/libxml/ruby_xml_xinclude.c +18 -0
  184. data/ext/libxml/ruby_xml_xinclude.h +13 -0
  185. data/ext/libxml/ruby_xml_xinclude.o +0 -0
  186. data/ext/libxml/ruby_xml_xpath.c +107 -0
  187. data/ext/libxml/ruby_xml_xpath.h +12 -0
  188. data/ext/libxml/ruby_xml_xpath.o +0 -0
  189. data/ext/libxml/ruby_xml_xpath_context.c +387 -0
  190. data/ext/libxml/ruby_xml_xpath_context.h +11 -0
  191. data/ext/libxml/ruby_xml_xpath_context.o +0 -0
  192. data/ext/libxml/ruby_xml_xpath_expression.c +83 -0
  193. data/ext/libxml/ruby_xml_xpath_expression.h +12 -0
  194. data/ext/libxml/ruby_xml_xpath_expression.o +0 -0
  195. data/ext/libxml/ruby_xml_xpath_object.c +336 -0
  196. data/ext/libxml/ruby_xml_xpath_object.h +19 -0
  197. data/ext/libxml/ruby_xml_xpath_object.o +0 -0
  198. data/ext/libxml/ruby_xml_xpointer.c +101 -0
  199. data/ext/libxml/ruby_xml_xpointer.h +13 -0
  200. data/ext/libxml/ruby_xml_xpointer.o +0 -0
  201. data/ext/mingw/Rakefile +34 -0
  202. data/ext/mingw/build.rake +41 -0
  203. data/ext/vc/libxml_ruby.sln +26 -0
  204. data/lib/libxml.rb +30 -0
  205. data/lib/libxml/attr.rb +111 -0
  206. data/lib/libxml/attr_decl.rb +78 -0
  207. data/lib/libxml/attributes.rb +12 -0
  208. data/lib/libxml/document.rb +190 -0
  209. data/lib/libxml/error.rb +88 -0
  210. data/lib/libxml/hpricot.rb +76 -0
  211. data/lib/libxml/html_parser.rb +94 -0
  212. data/lib/libxml/namespace.rb +60 -0
  213. data/lib/libxml/namespaces.rb +36 -0
  214. data/lib/libxml/node.rb +385 -0
  215. data/lib/libxml/ns.rb +20 -0
  216. data/lib/libxml/parser.rb +365 -0
  217. data/lib/libxml/properties.rb +21 -0
  218. data/lib/libxml/reader.rb +27 -0
  219. data/lib/libxml/sax_callbacks.rb +178 -0
  220. data/lib/libxml/sax_parser.rb +56 -0
  221. data/lib/libxml/tree.rb +27 -0
  222. data/lib/libxml/xpath_object.rb +14 -0
  223. data/lib/xml.rb +14 -0
  224. data/lib/xml/libxml.rb +8 -0
  225. data/setup.rb +1585 -0
  226. data/test/etc_doc_to_s.rb +19 -0
  227. data/test/ets_doc_file.rb +15 -0
  228. data/test/ets_doc_to_s.rb +21 -0
  229. data/test/ets_gpx.rb +26 -0
  230. data/test/ets_node_gc.rb +21 -0
  231. data/test/ets_test.xml +2 -0
  232. data/test/ets_tsr.rb +9 -0
  233. data/test/model/atom.xml +13 -0
  234. data/test/model/bands.xml +5 -0
  235. data/test/model/books.xml +146 -0
  236. data/test/model/merge_bug_data.xml +58 -0
  237. data/test/model/ruby-lang.html +238 -0
  238. data/test/model/rubynet.xml +79 -0
  239. data/test/model/rubynet_project +1 -0
  240. data/test/model/shiporder.rnc +28 -0
  241. data/test/model/shiporder.rng +86 -0
  242. data/test/model/shiporder.xml +23 -0
  243. data/test/model/shiporder.xsd +31 -0
  244. data/test/model/soap.xml +27 -0
  245. data/test/model/xinclude.xml +5 -0
  246. data/test/tc_attr.rb +170 -0
  247. data/test/tc_attr_decl.rb +131 -0
  248. data/test/tc_attributes.rb +133 -0
  249. data/test/tc_deprecated_require.rb +11 -0
  250. data/test/tc_document.rb +113 -0
  251. data/test/tc_document_write.rb +118 -0
  252. data/test/tc_dtd.rb +123 -0
  253. data/test/tc_error.rb +136 -0
  254. data/test/tc_html_parser.rb +138 -0
  255. data/test/tc_namespace.rb +59 -0
  256. data/test/tc_namespaces.rb +174 -0
  257. data/test/tc_node.rb +181 -0
  258. data/test/tc_node_cdata.rb +49 -0
  259. data/test/tc_node_comment.rb +30 -0
  260. data/test/tc_node_copy.rb +40 -0
  261. data/test/tc_node_edit.rb +158 -0
  262. data/test/tc_node_text.rb +69 -0
  263. data/test/tc_node_write.rb +83 -0
  264. data/test/tc_node_xlink.rb +26 -0
  265. data/test/tc_parser.rb +330 -0
  266. data/test/tc_parser_context.rb +186 -0
  267. data/test/tc_properties.rb +36 -0
  268. data/test/tc_reader.rb +284 -0
  269. data/test/tc_relaxng.rb +51 -0
  270. data/test/tc_sax_parser.rb +274 -0
  271. data/test/tc_schema.rb +51 -0
  272. data/test/tc_traversal.rb +220 -0
  273. data/test/tc_xinclude.rb +19 -0
  274. data/test/tc_xml.rb +224 -0
  275. data/test/tc_xpath.rb +193 -0
  276. data/test/tc_xpath_context.rb +78 -0
  277. data/test/tc_xpath_expression.rb +35 -0
  278. data/test/tc_xpointer.rb +72 -0
  279. data/test/test_suite.rb +33 -0
  280. metadata +376 -0
@@ -0,0 +1,936 @@
1
+ /* $Id: ruby_xml_document.c 854 2009-03-22 04:27:13Z cfis $ */
2
+
3
+ /*
4
+ * Document-class: LibXML::XML::Document
5
+ *
6
+ * The XML::Document class provides a tree based API for working
7
+ * with xml documents. You may directly create a document and
8
+ * manipulate it, or create a document from a data source by
9
+ * using an XML::Parser object.
10
+ *
11
+ * To read a document from a file:
12
+ *
13
+ * doc = XML::Document.file('my_file')
14
+ *
15
+ * To use a parser to read a document:
16
+ *
17
+ * parser = XML::Parser.file('my_file')
18
+ * doc = parser.parse
19
+ *
20
+ * To create a document from scratch:
21
+ *
22
+ * doc = XML::Document.new()
23
+ * doc.root = XML::Node.new('root_node')
24
+ * doc.root << XML::Node.new('elem1')
25
+ * doc.save(filename, :indent => true, :encoding => 'UTF-8')
26
+ *
27
+ * To write a document to a file:
28
+ *
29
+ * doc = XML::Document.new()
30
+ * doc.root = XML::Node.new('root_node')
31
+ * root = doc.root
32
+ *
33
+ * root << elem1 = XML::Node.new('elem1')
34
+ * elem1['attr1'] = 'val1'
35
+ * elem1['attr2'] = 'val2'
36
+ *
37
+ * root << elem2 = XML::Node.new('elem2')
38
+ * elem2['attr1'] = 'val1'
39
+ * elem2['attr2'] = 'val2'
40
+ *
41
+ * root << elem3 = XML::Node.new('elem3')
42
+ * elem3 << elem4 = XML::Node.new('elem4')
43
+ * elem3 << elem5 = XML::Node.new('elem5')
44
+ *
45
+ * elem5 << elem6 = XML::Node.new('elem6')
46
+ * elem6 << 'Content for element 6'
47
+ *
48
+ * elem3['attr'] = 'baz'
49
+ *
50
+ * doc.save(filename, :indent => true, :encoding => 'UTF-8')
51
+ */
52
+
53
+ #include <stdarg.h>
54
+ #include "ruby_libxml.h"
55
+ #include "ruby_xml_document.h"
56
+
57
+ VALUE cXMLDocument;
58
+
59
+
60
+ void rxml_document_free(xmlDocPtr xdoc)
61
+ {
62
+ xdoc->_private = NULL;
63
+ xmlFreeDoc(xdoc);
64
+ }
65
+
66
+ VALUE rxml_document_wrap(xmlDocPtr xdoc)
67
+ {
68
+ VALUE result;
69
+
70
+ // This node is already wrapped
71
+ if (xdoc->_private != NULL)
72
+ {
73
+ result = (VALUE) xdoc->_private;
74
+ }
75
+ else
76
+ {
77
+ result = Data_Wrap_Struct(cXMLDocument, NULL, rxml_document_free, xdoc);
78
+ xdoc->_private = (void*) result;
79
+ }
80
+
81
+ return result;
82
+ }
83
+
84
+ static void LibXML_validity_warning(void * ctxt, const char * msg, va_list ap)
85
+ {
86
+ if (rb_block_given_p())
87
+ {
88
+ char buff[1024];
89
+ snprintf(buff, 1024, msg, ap);
90
+ rb_yield(rb_ary_new3(2, rb_str_new2(buff), Qfalse));
91
+ }
92
+ else
93
+ {
94
+ fprintf(stderr, "warning -- found validity error: ");
95
+ fprintf(stderr, msg, ap);
96
+ }
97
+ }
98
+
99
+ /*
100
+ * call-seq:
101
+ * XML::Document.alloc(xml_version = 1.0) -> document
102
+ *
103
+ * Alocates a new XML::Document, optionally specifying the
104
+ * XML version.
105
+ */
106
+ static VALUE rxml_document_alloc(VALUE klass)
107
+ {
108
+ return Data_Wrap_Struct(klass, NULL, rxml_document_free, NULL);
109
+ }
110
+
111
+ /*
112
+ * call-seq:
113
+ * XML::Document.initialize(xml_version = 1.0) -> document
114
+ *
115
+ * Initializes a new XML::Document, optionally specifying the
116
+ * XML version.
117
+ */
118
+ static VALUE rxml_document_initialize(int argc, VALUE *argv, VALUE self)
119
+ {
120
+ xmlDocPtr xdoc;
121
+ VALUE xmlver;
122
+
123
+ switch (argc)
124
+ {
125
+ case 0:
126
+ xmlver = rb_str_new2("1.0");
127
+ break;
128
+ case 1:
129
+ rb_scan_args(argc, argv, "01", &xmlver);
130
+ break;
131
+ default:
132
+ rb_raise(rb_eArgError, "wrong number of arguments (need 0 or 1)");
133
+ }
134
+
135
+ Check_Type(xmlver, T_STRING);
136
+ xdoc = xmlNewDoc((xmlChar*) StringValuePtr(xmlver));
137
+ xdoc->_private = (void*) self;
138
+ DATA_PTR(self) = xdoc;
139
+
140
+ return self;
141
+ }
142
+
143
+ /*
144
+ * call-seq:
145
+ * document.compression -> num
146
+ *
147
+ * Obtain this document's compression mode identifier.
148
+ */
149
+ static VALUE rxml_document_compression_get(VALUE self)
150
+ {
151
+ #ifdef HAVE_ZLIB_H
152
+ xmlDocPtr xdoc;
153
+
154
+ int compmode;
155
+ Data_Get_Struct(self, xmlDoc, xdoc);
156
+
157
+ compmode = xmlGetDocCompressMode(xdoc);
158
+ if (compmode == -1)
159
+ return(Qnil);
160
+ else
161
+ return(INT2NUM(compmode));
162
+ #else
163
+ rb_warn("libxml not compiled with zlib support");
164
+ return (Qfalse);
165
+ #endif
166
+ }
167
+
168
+ /*
169
+ * call-seq:
170
+ * document.compression = num
171
+ *
172
+ * Set this document's compression mode.
173
+ */
174
+ static VALUE rxml_document_compression_set(VALUE self, VALUE num)
175
+ {
176
+ #ifdef HAVE_ZLIB_H
177
+ xmlDocPtr xdoc;
178
+
179
+ int compmode;
180
+ Check_Type(num, T_FIXNUM);
181
+ Data_Get_Struct(self, xmlDoc, xdoc);
182
+
183
+ if (xdoc == NULL)
184
+ {
185
+ return(Qnil);
186
+ }
187
+ else
188
+ {
189
+ xmlSetDocCompressMode(xdoc, NUM2INT(num));
190
+
191
+ compmode = xmlGetDocCompressMode(xdoc);
192
+ if (compmode == -1)
193
+ return(Qnil);
194
+ else
195
+ return(INT2NUM(compmode));
196
+ }
197
+ #else
198
+ rb_warn("libxml compiled without zlib support");
199
+ return (Qfalse);
200
+ #endif
201
+ }
202
+
203
+ /*
204
+ * call-seq:
205
+ * document.compression? -> (true|false)
206
+ *
207
+ * Determine whether this document is compressed.
208
+ */
209
+ static VALUE rxml_document_compression_q(VALUE self)
210
+ {
211
+ #ifdef HAVE_ZLIB_H
212
+ xmlDocPtr xdoc;
213
+
214
+ Data_Get_Struct(self, xmlDoc, xdoc);
215
+
216
+ if (xdoc->compression != -1)
217
+ return(Qtrue);
218
+ else
219
+ return(Qfalse);
220
+ #else
221
+ rb_warn("libxml compiled without zlib support");
222
+ return (Qfalse);
223
+ #endif
224
+ }
225
+
226
+ /*
227
+ * call-seq:
228
+ * document.child -> node
229
+ *
230
+ * Get this document's child node.
231
+ */
232
+ static VALUE rxml_document_child_get(VALUE self)
233
+ {
234
+ xmlDocPtr xdoc;
235
+ Data_Get_Struct(self, xmlDoc, xdoc);
236
+
237
+ if (xdoc->children == NULL)
238
+ return (Qnil);
239
+
240
+ return rxml_node_wrap(xdoc->children);
241
+ }
242
+
243
+ /*
244
+ * call-seq:
245
+ * document.child? -> (true|false)
246
+ *
247
+ * Determine whether this document has a child node.
248
+ */
249
+ static VALUE rxml_document_child_q(VALUE self)
250
+ {
251
+ xmlDocPtr xdoc;
252
+ Data_Get_Struct(self, xmlDoc, xdoc);
253
+
254
+ if (xdoc->children == NULL)
255
+ return (Qfalse);
256
+ else
257
+ return (Qtrue);
258
+ }
259
+
260
+
261
+ /*
262
+ * call-seq:
263
+ * node.debug -> true|false
264
+ *
265
+ * Print libxml debugging information to stdout.
266
+ * Requires that libxml was compiled with debugging enabled.
267
+ */
268
+ static VALUE rxml_document_debug(VALUE self)
269
+ {
270
+ #ifdef LIBXML_DEBUG_ENABLED
271
+ xmlDocPtr xdoc;
272
+ Data_Get_Struct(self, xmlDoc, xdoc);
273
+ xmlDebugDumpDocument(NULL, xdoc);
274
+ return Qtrue;
275
+ #else
276
+ rb_warn("libxml was compiled without debugging support.")
277
+ return Qfalse;
278
+ #endif
279
+ }
280
+
281
+ /*
282
+ * call-seq:
283
+ * document.encoding -> XML::Encoding::UTF_8
284
+ *
285
+ * Obtain the encoding specified by this document.
286
+ */
287
+ static VALUE rxml_document_encoding_get(VALUE self)
288
+ {
289
+ xmlDocPtr xdoc;
290
+ const char *xencoding;
291
+ Data_Get_Struct(self, xmlDoc, xdoc);
292
+
293
+ xencoding = (const char*)xdoc->encoding;
294
+ return INT2NUM(xmlParseCharEncoding(xencoding));
295
+ }
296
+
297
+ /*
298
+ * call-seq:
299
+ * document.encoding = XML::Encoding::UTF_8
300
+ *
301
+ * Set the encoding for this document.
302
+ */
303
+ static VALUE rxml_document_encoding_set(VALUE self, VALUE encoding)
304
+ {
305
+ xmlDocPtr xdoc;
306
+ const char* xencoding = xmlGetCharEncodingName((xmlCharEncoding)NUM2INT(encoding));
307
+
308
+ Data_Get_Struct(self, xmlDoc, xdoc);
309
+
310
+ if (xdoc->encoding != NULL)
311
+ xmlFree((xmlChar *) xdoc->encoding);
312
+
313
+ xdoc->encoding = xmlStrdup((xmlChar *)xencoding);
314
+ return self;
315
+ }
316
+
317
+ /*
318
+ * call-seq:
319
+ * document.import(node) -> XML::Node
320
+ *
321
+ * Creates a copy of the node that can be inserted into the
322
+ * current document.
323
+ */
324
+ static VALUE rxml_document_import(VALUE self, VALUE node)
325
+ {
326
+ xmlDocPtr xdoc;
327
+ xmlNodePtr xnode, xresult;
328
+
329
+ Data_Get_Struct(self, xmlDoc, xdoc);
330
+ Data_Get_Struct(node, xmlNode, xnode);
331
+
332
+ xresult = xmlDocCopyNode(xnode, xdoc, 1);
333
+
334
+ if (xresult == NULL)
335
+ rxml_raise(&xmlLastError);
336
+
337
+ return rxml_node_wrap(xresult);
338
+ }
339
+
340
+ /*
341
+ * call-seq:
342
+ * document.last -> node
343
+ *
344
+ * Obtain the last node.
345
+ */
346
+ static VALUE rxml_document_last_get(VALUE self)
347
+ {
348
+ xmlDocPtr xdoc;
349
+
350
+ Data_Get_Struct(self, xmlDoc, xdoc);
351
+
352
+ if (xdoc->last == NULL)
353
+ return (Qnil);
354
+
355
+ return rxml_node_wrap(xdoc->last);
356
+ }
357
+
358
+ /*
359
+ * call-seq:
360
+ * document.last? -> (true|false)
361
+ *
362
+ * Determine whether there is a last node.
363
+ */
364
+ static VALUE rxml_document_last_q(VALUE self)
365
+ {
366
+ xmlDocPtr xdoc;
367
+
368
+ Data_Get_Struct(self, xmlDoc, xdoc);
369
+
370
+ if (xdoc->last == NULL)
371
+ return (Qfalse);
372
+ else
373
+ return (Qtrue);
374
+ }
375
+
376
+ /*
377
+ * call-seq:
378
+ * document.next -> node
379
+ *
380
+ * Obtain the next node.
381
+ */
382
+ static VALUE rxml_document_next_get(VALUE self)
383
+ {
384
+ xmlDocPtr xdoc;
385
+
386
+ Data_Get_Struct(self, xmlDoc, xdoc);
387
+
388
+ if (xdoc->next == NULL)
389
+ return (Qnil);
390
+
391
+ return rxml_node_wrap(xdoc->next);
392
+ }
393
+
394
+ /*
395
+ * call-seq:
396
+ * document.next? -> (true|false)
397
+ *
398
+ * Determine whether there is a next node.
399
+ */
400
+ static VALUE rxml_document_next_q(VALUE self)
401
+ {
402
+ xmlDocPtr xdoc;
403
+
404
+ Data_Get_Struct(self, xmlDoc, xdoc);
405
+
406
+ if (xdoc->next == NULL)
407
+ return (Qfalse);
408
+ else
409
+ return (Qtrue);
410
+ }
411
+
412
+ /*
413
+ * call-seq:
414
+ * node.type -> num
415
+ *
416
+ * Obtain this node's type identifier.
417
+ */
418
+ static VALUE rxml_document_node_type(VALUE self)
419
+ {
420
+ xmlNodePtr xnode;
421
+ Data_Get_Struct(self, xmlNode, xnode);
422
+ return (INT2NUM(xnode->type));
423
+ }
424
+
425
+ /*
426
+ * call-seq:
427
+ * document.parent -> node
428
+ *
429
+ * Obtain the parent node.
430
+ */
431
+ static VALUE rxml_document_parent_get(VALUE self)
432
+ {
433
+ xmlDocPtr xdoc;
434
+
435
+ Data_Get_Struct(self, xmlDoc, xdoc);
436
+
437
+ if (xdoc->parent == NULL)
438
+ return (Qnil);
439
+
440
+ return rxml_node_wrap(xdoc->parent);
441
+ }
442
+
443
+ /*
444
+ * call-seq:
445
+ * document.parent? -> (true|false)
446
+ *
447
+ * Determine whether there is a parent node.
448
+ */
449
+ static VALUE rxml_document_parent_q(VALUE self)
450
+ {
451
+ xmlDocPtr xdoc;
452
+
453
+ Data_Get_Struct(self, xmlDoc, xdoc);
454
+
455
+ if (xdoc->parent == NULL)
456
+ return (Qfalse);
457
+ else
458
+ return (Qtrue);
459
+ }
460
+
461
+ /*
462
+ * call-seq:
463
+ * document.prev -> node
464
+ *
465
+ * Obtain the previous node.
466
+ */
467
+ static VALUE rxml_document_prev_get(VALUE self)
468
+ {
469
+ xmlDocPtr xdoc;
470
+
471
+ Data_Get_Struct(self, xmlDoc, xdoc);
472
+
473
+ if (xdoc->prev == NULL)
474
+ return (Qnil);
475
+
476
+ return rxml_node_wrap(xdoc->prev);
477
+ }
478
+
479
+ /*
480
+ * call-seq:
481
+ * document.prev? -> (true|false)
482
+ *
483
+ * Determine whether there is a previous node.
484
+ */
485
+ static VALUE rxml_document_prev_q(VALUE self)
486
+ {
487
+ xmlDocPtr xdoc;
488
+
489
+ Data_Get_Struct(self, xmlDoc, xdoc);
490
+
491
+ if (xdoc->prev == NULL)
492
+ return (Qfalse);
493
+ else
494
+ return (Qtrue);
495
+ }
496
+
497
+ /*
498
+ * call-seq:
499
+ * document.root -> node
500
+ *
501
+ * Obtain the root node.
502
+ */
503
+ static VALUE rxml_document_root_get(VALUE self)
504
+ {
505
+ xmlDocPtr xdoc;
506
+
507
+ xmlNodePtr root;
508
+
509
+ Data_Get_Struct(self, xmlDoc, xdoc);
510
+ root = xmlDocGetRootElement(xdoc);
511
+
512
+ if (root == NULL)
513
+ return (Qnil);
514
+
515
+ return rxml_node_wrap(root);
516
+ }
517
+
518
+ /*
519
+ * call-seq:
520
+ * document.root = node
521
+ *
522
+ * Set the root node.
523
+ */
524
+ static VALUE rxml_document_root_set(VALUE self, VALUE node)
525
+ {
526
+ xmlDocPtr xdoc;
527
+ xmlNodePtr xroot, xnode;
528
+
529
+ if (rb_obj_is_kind_of(node, cXMLNode) == Qfalse)
530
+ rb_raise(rb_eTypeError, "must pass an XML::Node type object");
531
+
532
+ Data_Get_Struct(self, xmlDoc, xdoc);
533
+ Data_Get_Struct(node, xmlNode, xnode);
534
+
535
+ xroot = xmlDocSetRootElement(xdoc, xnode);
536
+ return node;
537
+ }
538
+
539
+ /*
540
+ * call-seq:
541
+ * document.save(filename) -> int
542
+ * document.save(filename, :indent => true, :encoding => 'UTF-8') -> int
543
+ *
544
+ * Saves a document to a file. You may provide an optional hash table
545
+ * to control how the string is generated. Valid options are:
546
+ *
547
+ * :indent - Specifies if the string should be indented. The default value
548
+ * is true. Note that indentation is only added if both :indent is
549
+ * true and XML.indent_tree_output is true. If :indent is set to false,
550
+ * then both indentation and line feeds are removed from the result.
551
+ *
552
+ * :encoding - Specifies the output encoding of the string. It
553
+ * defaults to the original encoding of the document (see
554
+ * #encoding. To override the orginal encoding, use one of the
555
+ * XML::Encoding encoding constants. */
556
+ static VALUE rxml_document_save(int argc, VALUE *argv, VALUE self)
557
+ {
558
+ VALUE options = Qnil;
559
+ VALUE filename = Qnil;
560
+ xmlDocPtr xdoc;
561
+ int indent = 1;
562
+ const char *xfilename;
563
+ const char *xencoding;
564
+ int length;
565
+
566
+ rb_scan_args(argc, argv, "11", &filename, &options);
567
+
568
+ Check_Type(filename, T_STRING);
569
+ xfilename = StringValuePtr(filename);
570
+
571
+ Data_Get_Struct(self, xmlDoc, xdoc);
572
+ xencoding = xdoc->encoding;
573
+
574
+ if (!NIL_P(options))
575
+ {
576
+ VALUE rencoding, rindent;
577
+ Check_Type(options, T_HASH);
578
+ rencoding = rb_hash_aref(options, ID2SYM(rb_intern("encoding")));
579
+ rindent = rb_hash_aref(options, ID2SYM(rb_intern("indent")));
580
+
581
+ if (rindent == Qfalse)
582
+ indent = 0;
583
+
584
+ if (rencoding != Qnil)
585
+ {
586
+ xencoding = xmlGetCharEncodingName((xmlCharEncoding)NUM2INT(rencoding));
587
+ if (!xencoding)
588
+ rb_raise(rb_eArgError, "Unknown encoding value: %d", NUM2INT(rencoding));
589
+ }
590
+ }
591
+
592
+ length = xmlSaveFormatFileEnc(xfilename, xdoc, xencoding, indent);
593
+
594
+ if (length == -1)
595
+ rxml_raise(&xmlLastError);
596
+
597
+ return (INT2NUM(length));
598
+ }
599
+
600
+ /*
601
+ * call-seq:
602
+ * document.standalone? -> (true|false)
603
+ *
604
+ * Determine whether this is a standalone document.
605
+ */
606
+ static VALUE rxml_document_standalone_q(VALUE self)
607
+ {
608
+ xmlDocPtr xdoc;
609
+
610
+ Data_Get_Struct(self, xmlDoc, xdoc);
611
+ if (xdoc->standalone)
612
+ return (Qtrue);
613
+ else
614
+ return (Qfalse);
615
+ }
616
+
617
+ /*
618
+ * call-seq:
619
+ * document.to_s -> "string"
620
+ * document.to_s(:indent => true, :encoding => 'UTF-8') -> "string"
621
+ *
622
+ * Converts a document, and all of its children, to a string representation.
623
+ * You may provide an optional hash table to control how the string is
624
+ * generated. Valid options are:
625
+ *
626
+ * :indent - Specifies if the string should be indented. The default value
627
+ * is true. Note that indentation is only added if both :indent is
628
+ * true and XML.indent_tree_output is true. If :indent is set to false,
629
+ * then both indentation and line feeds are removed from the result.
630
+ *
631
+ * :encoding - Specifies the output encoding of the string. It
632
+ * defaults to XML::Encoding::UTF8. To change it, use one of the
633
+ * XML::Encoding encoding constants. */
634
+ static VALUE rxml_document_to_s(int argc, VALUE *argv, VALUE self)
635
+ {
636
+ VALUE result;
637
+ VALUE options = Qnil;
638
+ xmlDocPtr xdoc;
639
+ int indent = 1;
640
+ const char *xencoding = "UTF-8";
641
+ xmlChar *buffer;
642
+ int length;
643
+
644
+ rb_scan_args(argc, argv, "01", &options);
645
+
646
+ if (!NIL_P(options))
647
+ {
648
+ VALUE rencoding, rindent;
649
+ Check_Type(options, T_HASH);
650
+ rencoding = rb_hash_aref(options, ID2SYM(rb_intern("encoding")));
651
+ rindent = rb_hash_aref(options, ID2SYM(rb_intern("indent")));
652
+
653
+ if (rindent == Qfalse)
654
+ indent = 0;
655
+
656
+ if (rencoding != Qnil)
657
+ {
658
+ xencoding = xmlGetCharEncodingName((xmlCharEncoding)NUM2INT(rencoding));
659
+ if (!xencoding)
660
+ rb_raise(rb_eArgError, "Unknown encoding value: %d", NUM2INT(rencoding));
661
+ }
662
+ }
663
+
664
+ Data_Get_Struct(self, xmlDoc, xdoc);
665
+ xmlDocDumpFormatMemoryEnc(xdoc, &buffer, &length, xencoding, indent);
666
+
667
+ result = rb_str_new((const char*) buffer, length);
668
+ xmlFree(buffer);
669
+ return result;
670
+ }
671
+
672
+ /*
673
+ * call-seq:
674
+ * document.url -> "url"
675
+ *
676
+ * Obtain this document's source URL, if any.
677
+ */
678
+ static VALUE rxml_document_url_get(VALUE self)
679
+ {
680
+ xmlDocPtr xdoc;
681
+
682
+ Data_Get_Struct(self, xmlDoc, xdoc);
683
+ if (xdoc->URL == NULL)
684
+ return (Qnil);
685
+ else
686
+ return (rb_str_new2((const char*) xdoc->URL));
687
+ }
688
+
689
+ /*
690
+ * call-seq:
691
+ * document.version -> "version"
692
+ *
693
+ * Obtain the XML version specified by this document.
694
+ */
695
+ static VALUE rxml_document_version_get(VALUE self)
696
+ {
697
+ xmlDocPtr xdoc;
698
+
699
+ Data_Get_Struct(self, xmlDoc, xdoc);
700
+ if (xdoc->version == NULL)
701
+ return (Qnil);
702
+ else
703
+ return (rb_str_new2((const char*) xdoc->version));
704
+ }
705
+
706
+ /*
707
+ * call-seq:
708
+ * document.xhtml? -> (true|false)
709
+ *
710
+ * Determine whether this is an XHTML document.
711
+ */
712
+ static VALUE rxml_document_xhtml_q(VALUE self)
713
+ {
714
+ xmlDocPtr xdoc;
715
+ xmlDtdPtr xdtd;
716
+ Data_Get_Struct(self, xmlDoc, xdoc);
717
+ xdtd = xmlGetIntSubset(xdoc);
718
+ if (xdtd != NULL && xmlIsXHTML(xdtd->SystemID, xdtd->ExternalID) > 0)
719
+ return (Qtrue);
720
+ else
721
+ return (Qfalse);
722
+ }
723
+
724
+ /*
725
+ * call-seq:
726
+ * document.xinclude -> num
727
+ *
728
+ * Process xinclude directives in this document.
729
+ */
730
+ static VALUE rxml_document_xinclude(VALUE self)
731
+ {
732
+ #ifdef LIBXML_XINCLUDE_ENABLED
733
+ xmlDocPtr xdoc;
734
+
735
+ int ret;
736
+
737
+ Data_Get_Struct(self, xmlDoc, xdoc);
738
+ ret = xmlXIncludeProcess(xdoc);
739
+ if (ret >= 0)
740
+ {
741
+ return(INT2NUM(ret));
742
+ }
743
+ else
744
+ {
745
+ rxml_raise(&xmlLastError);
746
+ return Qnil;
747
+ }
748
+ #else
749
+ rb_warn(
750
+ "libxml was compiled without XInclude support. Please recompile libxml and ruby-libxml");
751
+ return (Qfalse);
752
+ #endif
753
+ }
754
+
755
+ void LibXML_validity_error(void * ctxt, const char * msg, va_list ap)
756
+ {
757
+ if (rb_block_given_p())
758
+ {
759
+ char buff[1024];
760
+ snprintf(buff, 1024, msg, ap);
761
+ rb_yield(rb_ary_new3(2, rb_str_new2(buff), Qtrue));
762
+ }
763
+ else
764
+ {
765
+ fprintf(stderr, "error -- found validity error: ");
766
+ fprintf(stderr, msg, ap);
767
+ }
768
+ }
769
+
770
+ /*
771
+ * call-seq:
772
+ * document.order_elements!
773
+ *
774
+ * Call this routine to speed up XPath computation on static documents.
775
+ * This stamps all the element nodes with the document order.
776
+ */
777
+ static VALUE rxml_document_order_elements(VALUE self)
778
+ {
779
+ xmlDocPtr xdoc;
780
+
781
+ Data_Get_Struct(self, xmlDoc, xdoc);
782
+ return LONG2FIX(xmlXPathOrderDocElems(xdoc));
783
+ }
784
+
785
+ /*
786
+ * call-seq:
787
+ * document.validate_schema(schema) -> (true|false)
788
+ *
789
+ * Validate this document against the specified XML::Schema.
790
+ *
791
+ * If a block is provided it is used as an error handler for validaten errors.
792
+ * The block is called with two argument, the message and a flag indication
793
+ * if the message is an error (true) or a warning (false).
794
+ */
795
+ static VALUE rxml_document_validate_schema(VALUE self, VALUE schema)
796
+ {
797
+ xmlSchemaValidCtxtPtr vptr;
798
+ xmlDocPtr xdoc;
799
+ xmlSchemaPtr xschema;
800
+ int is_invalid;
801
+
802
+ Data_Get_Struct(self, xmlDoc, xdoc);
803
+ Data_Get_Struct(schema, xmlSchema, xschema);
804
+
805
+ vptr = xmlSchemaNewValidCtxt(xschema);
806
+
807
+ xmlSchemaSetValidErrors(vptr,
808
+ (xmlSchemaValidityErrorFunc) LibXML_validity_error,
809
+ (xmlSchemaValidityWarningFunc) LibXML_validity_warning, NULL);
810
+
811
+ is_invalid = xmlSchemaValidateDoc(vptr, xdoc);
812
+ xmlSchemaFreeValidCtxt(vptr);
813
+ if (is_invalid)
814
+ {
815
+ rxml_raise(&xmlLastError);
816
+ return Qfalse;
817
+ }
818
+ else
819
+ {
820
+ return Qtrue;
821
+ }
822
+ }
823
+
824
+ /*
825
+ * call-seq:
826
+ * document.validate_schema(relaxng) -> (true|false)
827
+ *
828
+ * Validate this document against the specified XML::RelaxNG.
829
+ *
830
+ * If a block is provided it is used as an error handler for validaten errors.
831
+ * The block is called with two argument, the message and a flag indication
832
+ * if the message is an error (true) or a warning (false).
833
+ */
834
+ static VALUE rxml_document_validate_relaxng(VALUE self, VALUE relaxng)
835
+ {
836
+ xmlRelaxNGValidCtxtPtr vptr;
837
+ xmlDocPtr xdoc;
838
+ xmlRelaxNGPtr xrelaxng;
839
+ int is_invalid;
840
+
841
+ Data_Get_Struct(self, xmlDoc, xdoc);
842
+ Data_Get_Struct(relaxng, xmlRelaxNG, xrelaxng);
843
+
844
+ vptr = xmlRelaxNGNewValidCtxt(xrelaxng);
845
+
846
+ xmlRelaxNGSetValidErrors(vptr,
847
+ (xmlRelaxNGValidityErrorFunc) LibXML_validity_error,
848
+ (xmlRelaxNGValidityWarningFunc) LibXML_validity_warning, NULL);
849
+
850
+ is_invalid = xmlRelaxNGValidateDoc(vptr, xdoc);
851
+ xmlRelaxNGFreeValidCtxt(vptr);
852
+ if (is_invalid)
853
+ {
854
+ rxml_raise(&xmlLastError);
855
+ return Qfalse;
856
+ }
857
+ else
858
+ {
859
+ return Qtrue;
860
+ }
861
+ }
862
+
863
+ /*
864
+ * call-seq:
865
+ * document.validate(dtd) -> (true|false)
866
+ *
867
+ * Validate this document against the specified XML::DTD.
868
+ */
869
+ static VALUE rxml_document_validate_dtd(VALUE self, VALUE dtd)
870
+ {
871
+ VALUE error = Qnil;
872
+ xmlValidCtxt ctxt;
873
+ xmlDocPtr xdoc;
874
+ xmlDtdPtr xdtd;
875
+
876
+ Data_Get_Struct(self, xmlDoc, xdoc);
877
+ Data_Get_Struct(dtd, xmlDtd, xdtd);
878
+
879
+ ctxt.userData = &error;
880
+ ctxt.error = (xmlValidityErrorFunc) LibXML_validity_error;
881
+ ctxt.warning = (xmlValidityWarningFunc) LibXML_validity_warning;
882
+
883
+ ctxt.nodeNr = 0;
884
+ ctxt.nodeTab = NULL;
885
+ ctxt.vstateNr = 0;
886
+ ctxt.vstateTab = NULL;
887
+
888
+ if (xmlValidateDtd(&ctxt, xdoc, xdtd))
889
+ {
890
+ return (Qtrue);
891
+ }
892
+ else
893
+ {
894
+ rxml_raise(&xmlLastError);
895
+ return Qfalse;
896
+ }
897
+ }
898
+
899
+ void rxml_init_document(void)
900
+ {
901
+ cXMLDocument = rb_define_class_under(mXML, "Document", rb_cObject);
902
+ rb_define_alloc_func(cXMLDocument, rxml_document_alloc);
903
+
904
+ rb_define_method(cXMLDocument, "initialize", rxml_document_initialize, -1);
905
+ rb_define_method(cXMLDocument, "child", rxml_document_child_get, 0);
906
+ rb_define_method(cXMLDocument, "child?", rxml_document_child_q, 0);
907
+ rb_define_method(cXMLDocument, "compression", rxml_document_compression_get, 0);
908
+ rb_define_method(cXMLDocument, "compression=", rxml_document_compression_set, 1);
909
+ rb_define_method(cXMLDocument, "compression?", rxml_document_compression_q, 0);
910
+ rb_define_method(cXMLDocument, "debug", rxml_document_debug, 0);
911
+ rb_define_method(cXMLDocument, "encoding", rxml_document_encoding_get, 0);
912
+ rb_define_method(cXMLDocument, "encoding=", rxml_document_encoding_set, 1);
913
+ rb_define_method(cXMLDocument, "import", rxml_document_import, 1);
914
+ rb_define_method(cXMLDocument, "last", rxml_document_last_get, 0);
915
+ rb_define_method(cXMLDocument, "last?", rxml_document_last_q, 0);
916
+ rb_define_method(cXMLDocument, "next", rxml_document_next_get, 0);
917
+ rb_define_method(cXMLDocument, "next?", rxml_document_next_q, 0);
918
+ rb_define_method(cXMLDocument, "node_type", rxml_document_node_type, 0);
919
+ rb_define_method(cXMLDocument, "order_elements!", rxml_document_order_elements, 0);
920
+ rb_define_method(cXMLDocument, "parent", rxml_document_parent_get, 0);
921
+ rb_define_method(cXMLDocument, "parent?", rxml_document_parent_q, 0);
922
+ rb_define_method(cXMLDocument, "prev", rxml_document_prev_get, 0);
923
+ rb_define_method(cXMLDocument, "prev?", rxml_document_prev_q, 0);
924
+ rb_define_method(cXMLDocument, "root", rxml_document_root_get, 0);
925
+ rb_define_method(cXMLDocument, "root=", rxml_document_root_set, 1);
926
+ rb_define_method(cXMLDocument, "save", rxml_document_save, -1);
927
+ rb_define_method(cXMLDocument, "standalone?", rxml_document_standalone_q, 0);
928
+ rb_define_method(cXMLDocument, "to_s", rxml_document_to_s, -1);
929
+ rb_define_method(cXMLDocument, "url", rxml_document_url_get, 0);
930
+ rb_define_method(cXMLDocument, "version", rxml_document_version_get, 0);
931
+ rb_define_method(cXMLDocument, "xhtml?", rxml_document_xhtml_q, 0);
932
+ rb_define_method(cXMLDocument, "xinclude", rxml_document_xinclude, 0);
933
+ rb_define_method(cXMLDocument, "validate", rxml_document_validate_dtd, 1);
934
+ rb_define_method(cXMLDocument, "validate_schema", rxml_document_validate_schema, 1);
935
+ rb_define_method(cXMLDocument, "validate_relaxng", rxml_document_validate_relaxng, 1);
936
+ }