libxml-ruby 4.1.2 → 6.0.0

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 (172) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -887
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +77 -98
  6. data/ext/libxml/extconf.rb +39 -20
  7. data/ext/libxml/libxml.c +67 -79
  8. data/ext/libxml/ruby_libxml.h +43 -44
  9. data/ext/libxml/ruby_xml.c +556 -899
  10. data/ext/libxml/ruby_xml.h +9 -10
  11. data/ext/libxml/ruby_xml_attr.c +338 -333
  12. data/ext/libxml/ruby_xml_attr.h +13 -12
  13. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  14. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  15. data/ext/libxml/ruby_xml_attributes.c +18 -9
  16. data/ext/libxml/ruby_xml_attributes.h +17 -15
  17. data/ext/libxml/ruby_xml_document.c +1142 -1129
  18. data/ext/libxml/ruby_xml_document.h +12 -11
  19. data/ext/libxml/ruby_xml_dtd.c +287 -248
  20. data/ext/libxml/ruby_xml_dtd.h +10 -9
  21. data/ext/libxml/ruby_xml_encoding.c +250 -250
  22. data/ext/libxml/ruby_xml_encoding.h +20 -18
  23. data/ext/libxml/ruby_xml_error.c +1003 -996
  24. data/ext/libxml/ruby_xml_error.h +14 -14
  25. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  26. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  27. data/ext/libxml/ruby_xml_html_parser_context.c +364 -337
  28. data/ext/libxml/ruby_xml_html_parser_context.h +11 -10
  29. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  30. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  31. data/ext/libxml/ruby_xml_input_cbg.c +216 -188
  32. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  33. data/ext/libxml/ruby_xml_io.c +49 -47
  34. data/ext/libxml/ruby_xml_io.h +10 -10
  35. data/ext/libxml/ruby_xml_namespace.c +159 -154
  36. data/ext/libxml/ruby_xml_namespace.h +11 -10
  37. data/ext/libxml/ruby_xml_namespaces.c +313 -293
  38. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  39. data/ext/libxml/ruby_xml_node.c +1433 -1398
  40. data/ext/libxml/ruby_xml_node.h +15 -13
  41. data/ext/libxml/ruby_xml_parser.c +91 -91
  42. data/ext/libxml/ruby_xml_parser.h +10 -10
  43. data/ext/libxml/ruby_xml_parser_context.c +1016 -1001
  44. data/ext/libxml/ruby_xml_parser_context.h +11 -10
  45. data/ext/libxml/ruby_xml_parser_options.c +74 -66
  46. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  47. data/ext/libxml/ruby_xml_reader.c +40 -31
  48. data/ext/libxml/ruby_xml_reader.h +14 -14
  49. data/ext/libxml/ruby_xml_registry.c +31 -0
  50. data/ext/libxml/ruby_xml_registry.h +22 -0
  51. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  52. data/ext/libxml/ruby_xml_relaxng.h +9 -8
  53. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  54. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  55. data/ext/libxml/ruby_xml_sax_parser.c +108 -116
  56. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  57. data/ext/libxml/ruby_xml_schema.c +22 -15
  58. data/ext/libxml/ruby_xml_schema.h +26 -25
  59. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  60. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  61. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  62. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  63. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  64. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  65. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  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 +183 -185
  69. data/ext/libxml/ruby_xml_writer.h +6 -6
  70. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  71. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  72. data/ext/libxml/ruby_xml_xpath.c +195 -195
  73. data/ext/libxml/ruby_xml_xpath.h +15 -15
  74. data/ext/libxml/ruby_xml_xpath_context.c +408 -362
  75. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  76. data/ext/libxml/ruby_xml_xpath_expression.c +12 -6
  77. data/ext/libxml/ruby_xml_xpath_expression.h +11 -10
  78. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  79. data/ext/libxml/ruby_xml_xpath_object.h +19 -17
  80. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  81. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  82. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  83. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  85. data/lib/libxml/attr.rb +122 -122
  86. data/lib/libxml/attr_decl.rb +80 -80
  87. data/lib/libxml/attributes.rb +13 -13
  88. data/lib/libxml/document.rb +165 -194
  89. data/lib/libxml/error.rb +122 -95
  90. data/lib/libxml/html_parser.rb +80 -96
  91. data/lib/libxml/namespace.rb +61 -61
  92. data/lib/libxml/namespaces.rb +37 -37
  93. data/lib/libxml/node.rb +321 -323
  94. data/lib/libxml/parser.rb +94 -100
  95. data/lib/libxml/sax_callbacks.rb +179 -179
  96. data/lib/libxml/sax_parser.rb +40 -40
  97. data/lib/libxml/schema/attribute.rb +27 -19
  98. data/lib/libxml/schema/element.rb +20 -0
  99. data/lib/libxml/schema/type.rb +44 -21
  100. data/lib/libxml/schema.rb +47 -47
  101. data/lib/libxml/tree.rb +28 -28
  102. data/lib/libxml-ruby.rb +30 -30
  103. data/libxml-ruby.gemspec +46 -48
  104. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  105. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  106. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  107. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  108. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  109. data/test/c14n/result/with-comments/example-1 +5 -5
  110. data/test/c14n/result/with-comments/example-2 +10 -10
  111. data/test/c14n/result/with-comments/example-3 +13 -13
  112. data/test/c14n/result/with-comments/example-4 +8 -8
  113. data/test/c14n/result/with-comments/example-5 +3 -3
  114. data/test/c14n/result/without-comments/example-1 +3 -3
  115. data/test/c14n/result/without-comments/example-2 +10 -10
  116. data/test/c14n/result/without-comments/example-3 +13 -13
  117. data/test/c14n/result/without-comments/example-4 +8 -8
  118. data/test/c14n/result/without-comments/example-5 +2 -2
  119. data/test/test_attr.rb +179 -180
  120. data/test/test_attr_decl.rb +131 -131
  121. data/test/test_attributes.rb +135 -135
  122. data/test/test_canonicalize.rb +122 -120
  123. data/test/test_document.rb +138 -132
  124. data/test/test_document_write.rb +142 -145
  125. data/test/test_dtd.rb +134 -129
  126. data/test/test_encoding.rb +126 -129
  127. data/test/test_encoding_sax.rb +114 -114
  128. data/test/test_error.rb +197 -194
  129. data/test/test_helper.rb +21 -13
  130. data/test/test_html_parser.rb +166 -162
  131. data/test/test_html_parser_context.rb +22 -22
  132. data/test/test_input_callbacks.rb +36 -0
  133. data/test/test_namespace.rb +58 -60
  134. data/test/test_namespaces.rb +200 -200
  135. data/test/test_node.rb +251 -237
  136. data/test/test_node_cdata.rb +50 -50
  137. data/test/test_node_comment.rb +32 -32
  138. data/test/test_node_copy.rb +40 -40
  139. data/test/test_node_edit.rb +176 -158
  140. data/test/test_node_pi.rb +37 -37
  141. data/test/test_node_text.rb +69 -69
  142. data/test/test_node_write.rb +93 -96
  143. data/test/test_node_xlink.rb +28 -28
  144. data/test/test_parser.rb +297 -324
  145. data/test/test_parser_context.rb +198 -198
  146. data/test/test_properties.rb +38 -38
  147. data/test/test_reader.rb +413 -364
  148. data/test/test_relaxng.rb +59 -53
  149. data/test/test_sax_parser.rb +345 -326
  150. data/test/test_schema.rb +28 -0
  151. data/test/test_traversal.rb +152 -152
  152. data/test/test_writer.rb +469 -468
  153. data/test/test_xinclude.rb +20 -20
  154. data/test/test_xml.rb +164 -267
  155. data/test/test_xpath.rb +244 -244
  156. data/test/test_xpath_context.rb +87 -87
  157. data/test/test_xpath_expression.rb +37 -37
  158. metadata +49 -31
  159. data/README.rdoc +0 -217
  160. data/ext/libxml/extconf.h +0 -3
  161. data/ext/libxml/ruby_xml_cbg.c +0 -85
  162. data/lib/libxml/hpricot.rb +0 -78
  163. data/lib/libxml.rb +0 -5
  164. data/lib/xml/libxml.rb +0 -10
  165. data/lib/xml.rb +0 -14
  166. data/script/benchmark/depixelate +0 -634
  167. data/script/benchmark/hamlet.xml +0 -9055
  168. data/script/benchmark/parsecount +0 -170
  169. data/script/benchmark/sock_entries.xml +0 -507
  170. data/script/benchmark/throughput +0 -41
  171. data/script/test +0 -6
  172. data/test/test_deprecated_require.rb +0 -12
@@ -1,47 +1,49 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "ruby_libxml.h"
4
- #include <ruby/io.h>
5
-
6
- static ID READ_METHOD;
7
- static ID WRITE_METHOD;
8
-
9
- /* This method is called by libxml when it wants to read
10
- more data from a stream. We go with the duck typing
11
- solution to support StringIO objects. */
12
- int rxml_read_callback(void *context, char *buffer, int len)
13
- {
14
- VALUE io = (VALUE) context;
15
- VALUE string = rb_funcall(io, READ_METHOD, 1, INT2NUM(len));
16
- size_t size;
17
-
18
- if (string == Qnil)
19
- return 0;
20
-
21
- size = RSTRING_LEN(string);
22
- memcpy(buffer, StringValuePtr(string), size);
23
-
24
- return (int)size;
25
- }
26
-
27
- int rxml_write_callback(VALUE io, const char *buffer, int len)
28
- {
29
- if (rb_io_check_io(io) == Qnil)
30
- {
31
- // Could be StringIO
32
- VALUE written, string;
33
- string = rb_external_str_new_with_enc(buffer, (long)strlen(buffer), rb_enc_get(io));
34
- written = rb_funcall(io, WRITE_METHOD, 1, string);
35
- return NUM2INT(written);
36
- }
37
- else
38
- {
39
- return (int)rb_io_bufwrite(io, buffer, (size_t)len);
40
- }
41
- }
42
-
43
- void rxml_init_io(void)
44
- {
45
- READ_METHOD = rb_intern("read");
46
- WRITE_METHOD = rb_intern("write");
47
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include <ruby/io.h>
5
+
6
+ static ID READ_METHOD;
7
+ static ID WRITE_METHOD;
8
+
9
+ /* This method is called by libxml when it wants to read
10
+ more data from a stream. We go with the duck typing
11
+ solution to support StringIO objects. */
12
+ int rxml_read_callback(void *context, char *buffer, int len)
13
+ {
14
+ VALUE io = (VALUE) context;
15
+ VALUE string = rb_funcall(io, READ_METHOD, 1, INT2NUM(len));
16
+ size_t size;
17
+
18
+ if (string == Qnil)
19
+ return 0;
20
+
21
+ size = RSTRING_LEN(string);
22
+ if (size > (size_t)len)
23
+ size = (size_t)len;
24
+ memcpy(buffer, StringValuePtr(string), size);
25
+
26
+ return (int)size;
27
+ }
28
+
29
+ int rxml_write_callback(VALUE io, const char *buffer, int len)
30
+ {
31
+ if (rb_io_check_io(io) == Qnil)
32
+ {
33
+ // Could be StringIO
34
+ VALUE written, string;
35
+ string = rb_external_str_new_with_enc(buffer, (long)len, rb_enc_get(io));
36
+ written = rb_funcall(io, WRITE_METHOD, 1, string);
37
+ return NUM2INT(written);
38
+ }
39
+ else
40
+ {
41
+ return (int)rb_io_bufwrite(io, buffer, (size_t)len);
42
+ }
43
+ }
44
+
45
+ void rxml_init_io(void)
46
+ {
47
+ READ_METHOD = rb_intern("read");
48
+ WRITE_METHOD = rb_intern("write");
49
+ }
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_IO__
4
- #define __RXML_IO__
5
-
6
- int rxml_read_callback(void *context, char *buffer, int len);
7
- int rxml_write_callback(VALUE io, const char *buffer, int len);
8
- void rxml_init_io(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_IO__
4
+ #define __RXML_IO__
5
+
6
+ int rxml_read_callback(void *context, char *buffer, int len);
7
+ int rxml_write_callback(VALUE io, const char *buffer, int len);
8
+ void rxml_init_io(void);
9
+
10
+ #endif
@@ -1,154 +1,159 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "ruby_libxml.h"
4
- #include "ruby_xml_namespace.h"
5
-
6
- VALUE cXMLNamespace;
7
-
8
- /* Document-class: LibXML::XML::Namespace
9
- *
10
- * The Namespace class represents an XML namespace.
11
- * To add a namespace to a node, create a new instance
12
- * of this class. Note that this does *not* assign the
13
- * node to the namespace. To do that see the
14
- * XML::Namespaces#namespace method.
15
- *
16
- * Usage:
17
- *
18
- * node = XML::Node.new('<Envelope>')
19
- * XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
20
- * assert_equal("<Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
21
- * assert_nil(node.namespaces.namespace)
22
- */
23
-
24
- /* Namespaces are owned and freed by their nodes. Thus, its easier for the
25
- ruby bindings to not manage attribute memory management. */
26
-
27
- static VALUE rxml_namespace_alloc(VALUE klass)
28
- {
29
- return Data_Wrap_Struct(klass, NULL, NULL, NULL);
30
- }
31
-
32
- VALUE rxml_namespace_wrap(xmlNsPtr xns)
33
- {
34
- return Data_Wrap_Struct(cXMLNamespace, NULL, NULL, xns);
35
- }
36
-
37
-
38
- /*
39
- * call-seq:
40
- * initialize(node, "prefix", "href") -> XML::Namespace
41
- *
42
- * Create a new namespace and adds it to the specified node.
43
- * Note this does *not* assign the node to the namespace.
44
- * To do that see the XML::Namespaces#namespace method.
45
- */
46
- static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix,
47
- VALUE href)
48
- {
49
- xmlNodePtr xnode;
50
- xmlChar *xmlPrefix;
51
- xmlNsPtr xns;
52
-
53
- Check_Type(node, T_DATA);
54
- Data_Get_Struct(node, xmlNode, xnode);
55
- xmlResetLastError();
56
-
57
- /* Prefix can be null - that means its the default namespace */
58
- xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
59
- xns = xmlNewNs(xnode, (xmlChar*) StringValuePtr(href), xmlPrefix);
60
-
61
- if (!xns)
62
- rxml_raise(&xmlLastError);
63
-
64
- DATA_PTR(self) = xns;
65
- return self;
66
- }
67
-
68
- /*
69
- * call-seq:
70
- * ns.href -> "href"
71
- *
72
- * Usage:
73
- *
74
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
75
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
76
- * assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
77
- */
78
- static VALUE rxml_namespace_href_get(VALUE self)
79
- {
80
- xmlNsPtr xns;
81
- Data_Get_Struct(self, xmlNs, xns);
82
- if (xns->href == NULL)
83
- return Qnil;
84
- else
85
- return rxml_new_cstr( xns->href, NULL);
86
- }
87
-
88
- /*
89
- * call-seq:
90
- * ns.node_type -> num
91
- *
92
- * Obtain this namespace's type identifier.
93
- */
94
- static VALUE rxml_namespace_node_type(VALUE self)
95
- {
96
- xmlNsPtr xns;
97
- Data_Get_Struct(self, xmlNs, xns);
98
- return INT2NUM(xns->type);
99
- }
100
-
101
- /*
102
- * call-seq:
103
- * ns.prefix -> "prefix"
104
- *
105
- * Obtain the namespace's prefix.
106
- *
107
- * Usage:
108
- *
109
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
110
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
111
- * assert_equal('soap', ns.prefix)
112
- */
113
- static VALUE rxml_namespace_prefix_get(VALUE self)
114
- {
115
- xmlNsPtr xns;
116
- Data_Get_Struct(self, xmlNs, xns);
117
- if (xns->prefix == NULL)
118
- return Qnil;
119
- else
120
- return rxml_new_cstr( xns->prefix, NULL);
121
- }
122
-
123
- /*
124
- * call-seq:
125
- * ns.next -> XML::Namespace
126
- *
127
- * Obtain the next namespace.
128
- *
129
- * Usage:
130
- *
131
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
132
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
133
- * assert_nil(ns.next)
134
- */
135
- static VALUE rxml_namespace_next(VALUE self)
136
- {
137
- xmlNsPtr xns;
138
- Data_Get_Struct(self, xmlNs, xns);
139
- if (xns == NULL || xns->next == NULL)
140
- return (Qnil);
141
- else
142
- return rxml_namespace_wrap(xns->next);
143
- }
144
-
145
- void rxml_init_namespace(void)
146
- {
147
- cXMLNamespace = rb_define_class_under(mXML, "Namespace", rb_cObject);
148
- rb_define_alloc_func(cXMLNamespace, rxml_namespace_alloc);
149
- rb_define_method(cXMLNamespace, "initialize", rxml_namespace_initialize, 3);
150
- rb_define_method(cXMLNamespace, "href", rxml_namespace_href_get, 0);
151
- rb_define_method(cXMLNamespace, "next", rxml_namespace_next, 0);
152
- rb_define_method(cXMLNamespace, "node_type", rxml_namespace_node_type, 0);
153
- rb_define_method(cXMLNamespace, "prefix", rxml_namespace_prefix_get, 0);
154
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include "ruby_xml_namespace.h"
5
+
6
+ VALUE cXMLNamespace;
7
+
8
+ const rb_data_type_t rxml_namespace_type = {
9
+ "libxml/namespace",
10
+ {NULL, NULL, NULL},
11
+ };
12
+
13
+ /* Document-class: LibXML::XML::Namespace
14
+ *
15
+ * The Namespace class represents an XML namespace.
16
+ * To add a namespace to a node, create a new instance
17
+ * of this class. Note that this does *not* assign the
18
+ * node to the namespace. To do that see the
19
+ * XML::Namespaces#namespace method.
20
+ *
21
+ * Usage:
22
+ *
23
+ * node = XML::Node.new('<Envelope>')
24
+ * XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
25
+ * assert_equal("<Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
26
+ * assert_nil(node.namespaces.namespace)
27
+ */
28
+
29
+ /* Namespaces are owned and freed by their nodes. Thus, its easier for the
30
+ ruby bindings to not manage attribute memory management. */
31
+
32
+ static VALUE rxml_namespace_alloc(VALUE klass)
33
+ {
34
+ return TypedData_Wrap_Struct(klass, &rxml_namespace_type, NULL);
35
+ }
36
+
37
+ VALUE rxml_namespace_wrap(xmlNsPtr xns)
38
+ {
39
+ return TypedData_Wrap_Struct(cXMLNamespace, &rxml_namespace_type, xns);
40
+ }
41
+
42
+
43
+ /*
44
+ * call-seq:
45
+ * initialize(node, "prefix", "href") -> XML::Namespace
46
+ *
47
+ * Create a new namespace and adds it to the specified node.
48
+ * Note this does *not* assign the node to the namespace.
49
+ * To do that see the XML::Namespaces#namespace method.
50
+ */
51
+ static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix,
52
+ VALUE href)
53
+ {
54
+ xmlNodePtr xnode;
55
+ xmlChar *xmlPrefix;
56
+ xmlNsPtr xns;
57
+
58
+ TypedData_Get_Struct(node, xmlNode, &rxml_node_data_type, xnode);
59
+ xmlResetLastError();
60
+
61
+ /* Prefix can be null - that means its the default namespace */
62
+ xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
63
+ xns = xmlNewNs(xnode, (xmlChar*) StringValuePtr(href), xmlPrefix);
64
+
65
+ RTYPEDDATA_DATA(self) = xns;
66
+ return self;
67
+ }
68
+
69
+ /*
70
+ * call-seq:
71
+ * ns.href -> "href"
72
+ *
73
+ * Usage:
74
+ *
75
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
76
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
77
+ * assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
78
+ */
79
+ static VALUE rxml_namespace_href_get(VALUE self)
80
+ {
81
+ xmlNsPtr xns;
82
+ TypedData_Get_Struct(self, xmlNs, &rxml_namespace_type, xns);
83
+ if (xns->href == NULL)
84
+ return Qnil;
85
+ else
86
+ return rxml_new_cstr( xns->href, NULL);
87
+ }
88
+
89
+ /*
90
+ * call-seq:
91
+ * ns.node_type -> num
92
+ *
93
+ * Obtain this namespace's type identifier.
94
+ */
95
+ static VALUE rxml_namespace_node_type(VALUE self)
96
+ {
97
+ xmlNsPtr xns;
98
+ TypedData_Get_Struct(self, xmlNs, &rxml_namespace_type, xns);
99
+ return INT2NUM(xns->type);
100
+ }
101
+
102
+ /*
103
+ * call-seq:
104
+ * ns.prefix -> "prefix"
105
+ *
106
+ * Obtain the namespace's prefix.
107
+ *
108
+ * Usage:
109
+ *
110
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
111
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
112
+ * assert_equal('soap', ns.prefix)
113
+ */
114
+ static VALUE rxml_namespace_prefix_get(VALUE self)
115
+ {
116
+ xmlNsPtr xns;
117
+ TypedData_Get_Struct(self, xmlNs, &rxml_namespace_type, xns);
118
+ if (xns->prefix == NULL)
119
+ return Qnil;
120
+ else
121
+ return rxml_new_cstr( xns->prefix, NULL);
122
+ }
123
+
124
+ /*
125
+ * call-seq:
126
+ * ns.next -> XML::Namespace
127
+ *
128
+ * Obtain the next namespace.
129
+ *
130
+ * Usage:
131
+ *
132
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
133
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
134
+ * assert_nil(ns.next)
135
+ */
136
+ static VALUE rxml_namespace_next(VALUE self)
137
+ {
138
+ xmlNsPtr xns;
139
+ TypedData_Get_Struct(self, xmlNs, &rxml_namespace_type, xns);
140
+ /* Guard against libxml2's XPath hack where xns->next stores a parent
141
+ element pointer instead of the next namespace (see xmlXPathNodeSetAddNs
142
+ in xpath.c). xmlNs.type and xmlNode.type share the same struct offset,
143
+ so checking the type is safe even when next points to an xmlNode. */
144
+ if (xns == NULL || xns->next == NULL || xns->next->type != XML_LOCAL_NAMESPACE)
145
+ return (Qnil);
146
+
147
+ return rxml_namespace_wrap(xns->next);
148
+ }
149
+
150
+ void rxml_init_namespace(void)
151
+ {
152
+ cXMLNamespace = rb_define_class_under(mXML, "Namespace", rb_cObject);
153
+ rb_define_alloc_func(cXMLNamespace, rxml_namespace_alloc);
154
+ rb_define_method(cXMLNamespace, "initialize", rxml_namespace_initialize, 3);
155
+ rb_define_method(cXMLNamespace, "href", rxml_namespace_href_get, 0);
156
+ rb_define_method(cXMLNamespace, "next", rxml_namespace_next, 0);
157
+ rb_define_method(cXMLNamespace, "node_type", rxml_namespace_node_type, 0);
158
+ rb_define_method(cXMLNamespace, "prefix", rxml_namespace_prefix_get, 0);
159
+ }
@@ -1,10 +1,11 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_NAMESPACE__
4
- #define __RXML_NAMESPACE__
5
-
6
- extern VALUE cXMLNamespace;
7
-
8
- void rxml_init_namespace(void);
9
- VALUE rxml_namespace_wrap(xmlNsPtr xns);
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_NAMESPACE__
4
+ #define __RXML_NAMESPACE__
5
+
6
+ extern VALUE cXMLNamespace;
7
+ extern const rb_data_type_t rxml_namespace_type;
8
+
9
+ void rxml_init_namespace(void);
10
+ VALUE rxml_namespace_wrap(xmlNsPtr xns);
11
+ #endif