libxml-ruby 2.9.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY +811 -790
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +188 -184
  6. data/Rakefile +1 -1
  7. data/ext/libxml/libxml.c +80 -80
  8. data/ext/libxml/ruby_libxml.h +75 -75
  9. data/ext/libxml/ruby_xml.c +0 -84
  10. data/ext/libxml/ruby_xml.h +0 -10
  11. data/ext/libxml/ruby_xml_attr.h +12 -12
  12. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  13. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  14. data/ext/libxml/ruby_xml_attributes.c +275 -275
  15. data/ext/libxml/ruby_xml_attributes.h +15 -15
  16. data/ext/libxml/ruby_xml_document.c +21 -27
  17. data/ext/libxml/ruby_xml_document.h +11 -11
  18. data/ext/libxml/ruby_xml_dtd.c +2 -13
  19. data/ext/libxml/ruby_xml_dtd.h +9 -9
  20. data/ext/libxml/ruby_xml_error.c +996 -996
  21. data/ext/libxml/ruby_xml_error.h +12 -12
  22. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  23. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  24. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  25. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  26. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  27. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  28. data/ext/libxml/ruby_xml_io.c +0 -1
  29. data/ext/libxml/ruby_xml_io.h +10 -10
  30. data/ext/libxml/ruby_xml_namespace.c +153 -153
  31. data/ext/libxml/ruby_xml_namespace.h +10 -10
  32. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  33. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  34. data/ext/libxml/ruby_xml_node.c +100 -143
  35. data/ext/libxml/ruby_xml_node.h +13 -11
  36. data/ext/libxml/ruby_xml_parser.c +91 -94
  37. data/ext/libxml/ruby_xml_parser.h +12 -12
  38. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  39. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  40. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  41. data/ext/libxml/ruby_xml_reader.c +45 -37
  42. data/ext/libxml/ruby_xml_reader.h +17 -17
  43. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  44. data/ext/libxml/ruby_xml_sax2_handler.c +3 -3
  45. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  46. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  47. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  48. data/ext/libxml/ruby_xml_schema.h +809 -809
  49. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  50. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  51. data/ext/libxml/ruby_xml_schema_element.c +94 -94
  52. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  53. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  54. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  55. data/ext/libxml/ruby_xml_schema_type.c +259 -259
  56. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  57. data/ext/libxml/ruby_xml_version.h +9 -9
  58. data/ext/libxml/ruby_xml_writer.c +1136 -1136
  59. data/ext/libxml/ruby_xml_writer.h +10 -10
  60. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  61. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  62. data/ext/libxml/ruby_xml_xpath.c +42 -36
  63. data/ext/libxml/ruby_xml_xpath.h +13 -13
  64. data/ext/libxml/ruby_xml_xpath_context.c +1 -1
  65. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  66. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  67. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  68. data/ext/libxml/ruby_xml_xpath_object.c +5 -2
  69. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  70. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  71. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  72. data/ext/vc/libxml_ruby.sln +17 -15
  73. data/lib/libxml.rb +1 -6
  74. data/lib/libxml/node.rb +2 -78
  75. data/lib/libxml/parser.rb +0 -266
  76. data/lib/libxml/sax_parser.rb +0 -17
  77. data/lib/libxml/schema.rb +66 -66
  78. data/lib/libxml/schema/attribute.rb +19 -19
  79. data/lib/libxml/schema/element.rb +27 -27
  80. data/lib/libxml/schema/type.rb +29 -29
  81. data/script/benchmark/depixelate +634 -634
  82. data/script/benchmark/hamlet.xml +9054 -9054
  83. data/script/benchmark/parsecount +170 -170
  84. data/script/benchmark/throughput +41 -41
  85. data/script/test +6 -6
  86. data/test/c14n/given/example-1.xml +14 -14
  87. data/test/c14n/given/example-2.xml +11 -11
  88. data/test/c14n/given/example-3.xml +18 -18
  89. data/test/c14n/given/example-4.xml +9 -9
  90. data/test/c14n/given/example-5.xml +12 -12
  91. data/test/c14n/given/example-6.xml +2 -2
  92. data/test/c14n/given/example-7.xml +11 -11
  93. data/test/c14n/given/example-8.xml +11 -11
  94. data/test/c14n/given/example-8.xpath +9 -9
  95. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  96. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  97. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  98. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  99. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  100. data/test/c14n/result/with-comments/example-1 +5 -5
  101. data/test/c14n/result/with-comments/example-2 +10 -10
  102. data/test/c14n/result/with-comments/example-3 +13 -13
  103. data/test/c14n/result/with-comments/example-4 +8 -8
  104. data/test/c14n/result/with-comments/example-5 +3 -3
  105. data/test/c14n/result/without-comments/example-1 +3 -3
  106. data/test/c14n/result/without-comments/example-2 +10 -10
  107. data/test/c14n/result/without-comments/example-3 +13 -13
  108. data/test/c14n/result/without-comments/example-4 +8 -8
  109. data/test/c14n/result/without-comments/example-5 +2 -2
  110. data/test/model/atom.xml +12 -12
  111. data/test/model/bands.iso-8859-1.xml +4 -4
  112. data/test/model/bands.utf-8.xml +4 -4
  113. data/test/model/bands.xml +4 -4
  114. data/test/model/books.xml +153 -153
  115. data/test/model/merge_bug_data.xml +58 -58
  116. data/test/model/ruby-lang.html +238 -238
  117. data/test/model/rubynet.xml +79 -79
  118. data/test/model/shiporder.rnc +28 -28
  119. data/test/model/shiporder.rng +86 -86
  120. data/test/model/shiporder.xml +22 -22
  121. data/test/model/shiporder.xsd +39 -39
  122. data/test/model/soap.xml +27 -27
  123. data/test/model/xinclude.xml +4 -4
  124. data/test/tc_attributes.rb +0 -6
  125. data/test/tc_error.rb +157 -158
  126. data/test/tc_node.rb +33 -17
  127. data/test/tc_node_edit.rb +0 -15
  128. data/test/tc_node_pi.rb +39 -39
  129. data/test/tc_parser.rb +0 -48
  130. data/test/tc_reader.rb +12 -53
  131. data/test/tc_writer.rb +447 -447
  132. data/test/tc_xpath.rb +1 -1
  133. data/test/test_helper.rb +2 -2
  134. metadata +3 -8
  135. data/ext/libxml/extconf.h +0 -4
  136. data/lib/libxml/ns.rb +0 -22
  137. data/lib/libxml/properties.rb +0 -23
  138. data/lib/libxml/reader.rb +0 -29
  139. data/lib/libxml/xpath_object.rb +0 -16
@@ -1,153 +1,153 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- /*
4
- * Document-class: LibXML::XML::AttrDecl
5
- *
6
- * At attribute declaration is used in XML::Dtds to define
7
- * what attributes are allowed on an element. An attribute
8
- * declaration defines an attribues name, data type and default
9
- * value (if any).
10
- */
11
-
12
- #include "ruby_libxml.h"
13
-
14
- VALUE cXMLAttrDecl;
15
-
16
- void rxml_attr_decl_mark(xmlAttributePtr xattr)
17
- {
18
- rxml_node_mark((xmlNodePtr) xattr);
19
- }
20
-
21
- VALUE rxml_attr_decl_wrap(xmlAttributePtr xattr)
22
- {
23
- return Data_Wrap_Struct(cXMLAttrDecl, rxml_attr_decl_mark, NULL, xattr);
24
- }
25
-
26
- /*
27
- * call-seq:
28
- * attr_decl.doc -> XML::Document
29
- *
30
- * Returns this attribute declaration's document.
31
- */
32
- static VALUE rxml_attr_decl_doc_get(VALUE self)
33
- {
34
- xmlAttributePtr xattr;
35
- Data_Get_Struct(self, xmlAttribute, xattr);
36
- if (xattr->doc == NULL)
37
- return Qnil;
38
- else
39
- return rxml_document_wrap(xattr->doc);
40
- }
41
-
42
-
43
- /*
44
- * call-seq:
45
- * attr_decl.name -> "name"
46
- *
47
- * Obtain this attribute declaration's name.
48
- */
49
- static VALUE rxml_attr_decl_name_get(VALUE self)
50
- {
51
- xmlAttributePtr xattr;
52
- Data_Get_Struct(self, xmlAttribute, xattr);
53
-
54
- if (xattr->name == NULL)
55
- return Qnil;
56
- else
57
- return rxml_new_cstr( xattr->name, xattr->doc->encoding);
58
- }
59
-
60
- /*
61
- * call-seq:
62
- * attr_decl.next -> XML::AttrDecl
63
- *
64
- * Obtain the next attribute declaration.
65
- */
66
- static VALUE rxml_attr_decl_next_get(VALUE self)
67
- {
68
- xmlAttributePtr xattr;
69
- Data_Get_Struct(self, xmlAttribute, xattr);
70
- if (xattr->next == NULL)
71
- return Qnil;
72
- else
73
- return rxml_attr_decl_wrap((xmlAttributePtr)xattr->next);
74
- }
75
-
76
- /*
77
- * call-seq:
78
- * attr_decl.type -> num
79
- *
80
- * Obtain this attribute declaration's type node type.
81
- */
82
- static VALUE rxml_attr_decl_node_type(VALUE self)
83
- {
84
- xmlAttrPtr xattr;
85
- Data_Get_Struct(self, xmlAttr, xattr);
86
- return INT2NUM(xattr->type);
87
- }
88
-
89
- /*
90
- * call-seq:
91
- * attr_decl.parent -> XML::Dtd
92
- *
93
- * Obtain this attribute declaration's parent which
94
- * is an instance of a XML::DTD.
95
- */
96
- static VALUE rxml_attr_decl_parent_get(VALUE self)
97
- {
98
- xmlAttributePtr xattr;
99
- Data_Get_Struct(self, xmlAttribute, xattr);
100
-
101
- if (xattr->parent == NULL)
102
- return Qnil;
103
- else
104
- return rxml_dtd_wrap(xattr->parent);
105
- }
106
-
107
- /*
108
- * call-seq:
109
- * attr_decl.prev -> (XML::AttrDecl | XML::ElementDecl)
110
- *
111
- * Obtain the previous attribute declaration or the owning
112
- * element declration (not implemented).
113
- */
114
- static VALUE rxml_attr_decl_prev_get(VALUE self)
115
- {
116
- xmlAttributePtr xattr;
117
- Data_Get_Struct(self, xmlAttribute, xattr);
118
-
119
- if (xattr->prev == NULL)
120
- return Qnil;
121
- else
122
- return rxml_attr_decl_wrap((xmlAttributePtr)xattr->prev);
123
- }
124
-
125
- /*
126
- * call-seq:
127
- * attr_decl.value -> "value"
128
- *
129
- * Obtain the default value of this attribute declaration.
130
- */
131
- VALUE rxml_attr_decl_value_get(VALUE self)
132
- {
133
- xmlAttributePtr xattr;
134
-
135
- Data_Get_Struct(self, xmlAttribute, xattr);
136
-
137
- if (xattr->defaultValue)
138
- return rxml_new_cstr(xattr->defaultValue, NULL);
139
- else
140
- return Qnil;
141
- }
142
-
143
- void rxml_init_attr_decl(void)
144
- {
145
- cXMLAttrDecl = rb_define_class_under(mXML, "AttrDecl", rb_cObject);
146
- rb_define_method(cXMLAttrDecl, "doc", rxml_attr_decl_doc_get, 0);
147
- rb_define_method(cXMLAttrDecl, "name", rxml_attr_decl_name_get, 0);
148
- rb_define_method(cXMLAttrDecl, "next", rxml_attr_decl_next_get, 0);
149
- rb_define_method(cXMLAttrDecl, "node_type", rxml_attr_decl_node_type, 0);
150
- rb_define_method(cXMLAttrDecl, "parent", rxml_attr_decl_parent_get, 0);
151
- rb_define_method(cXMLAttrDecl, "prev", rxml_attr_decl_prev_get, 0);
152
- rb_define_method(cXMLAttrDecl, "value", rxml_attr_decl_value_get, 0);
153
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ /*
4
+ * Document-class: LibXML::XML::AttrDecl
5
+ *
6
+ * At attribute declaration is used in XML::Dtds to define
7
+ * what attributes are allowed on an element. An attribute
8
+ * declaration defines an attribues name, data type and default
9
+ * value (if any).
10
+ */
11
+
12
+ #include "ruby_libxml.h"
13
+
14
+ VALUE cXMLAttrDecl;
15
+
16
+ void rxml_attr_decl_mark(xmlAttributePtr xattr)
17
+ {
18
+ rxml_node_mark((xmlNodePtr) xattr);
19
+ }
20
+
21
+ VALUE rxml_attr_decl_wrap(xmlAttributePtr xattr)
22
+ {
23
+ return Data_Wrap_Struct(cXMLAttrDecl, rxml_attr_decl_mark, NULL, xattr);
24
+ }
25
+
26
+ /*
27
+ * call-seq:
28
+ * attr_decl.doc -> XML::Document
29
+ *
30
+ * Returns this attribute declaration's document.
31
+ */
32
+ static VALUE rxml_attr_decl_doc_get(VALUE self)
33
+ {
34
+ xmlAttributePtr xattr;
35
+ Data_Get_Struct(self, xmlAttribute, xattr);
36
+ if (xattr->doc == NULL)
37
+ return Qnil;
38
+ else
39
+ return rxml_document_wrap(xattr->doc);
40
+ }
41
+
42
+
43
+ /*
44
+ * call-seq:
45
+ * attr_decl.name -> "name"
46
+ *
47
+ * Obtain this attribute declaration's name.
48
+ */
49
+ static VALUE rxml_attr_decl_name_get(VALUE self)
50
+ {
51
+ xmlAttributePtr xattr;
52
+ Data_Get_Struct(self, xmlAttribute, xattr);
53
+
54
+ if (xattr->name == NULL)
55
+ return Qnil;
56
+ else
57
+ return rxml_new_cstr( xattr->name, xattr->doc->encoding);
58
+ }
59
+
60
+ /*
61
+ * call-seq:
62
+ * attr_decl.next -> XML::AttrDecl
63
+ *
64
+ * Obtain the next attribute declaration.
65
+ */
66
+ static VALUE rxml_attr_decl_next_get(VALUE self)
67
+ {
68
+ xmlAttributePtr xattr;
69
+ Data_Get_Struct(self, xmlAttribute, xattr);
70
+ if (xattr->next == NULL)
71
+ return Qnil;
72
+ else
73
+ return rxml_attr_decl_wrap((xmlAttributePtr)xattr->next);
74
+ }
75
+
76
+ /*
77
+ * call-seq:
78
+ * attr_decl.type -> num
79
+ *
80
+ * Obtain this attribute declaration's type node type.
81
+ */
82
+ static VALUE rxml_attr_decl_node_type(VALUE self)
83
+ {
84
+ xmlAttrPtr xattr;
85
+ Data_Get_Struct(self, xmlAttr, xattr);
86
+ return INT2NUM(xattr->type);
87
+ }
88
+
89
+ /*
90
+ * call-seq:
91
+ * attr_decl.parent -> XML::Dtd
92
+ *
93
+ * Obtain this attribute declaration's parent which
94
+ * is an instance of a XML::DTD.
95
+ */
96
+ static VALUE rxml_attr_decl_parent_get(VALUE self)
97
+ {
98
+ xmlAttributePtr xattr;
99
+ Data_Get_Struct(self, xmlAttribute, xattr);
100
+
101
+ if (xattr->parent == NULL)
102
+ return Qnil;
103
+ else
104
+ return rxml_dtd_wrap(xattr->parent);
105
+ }
106
+
107
+ /*
108
+ * call-seq:
109
+ * attr_decl.prev -> (XML::AttrDecl | XML::ElementDecl)
110
+ *
111
+ * Obtain the previous attribute declaration or the owning
112
+ * element declration (not implemented).
113
+ */
114
+ static VALUE rxml_attr_decl_prev_get(VALUE self)
115
+ {
116
+ xmlAttributePtr xattr;
117
+ Data_Get_Struct(self, xmlAttribute, xattr);
118
+
119
+ if (xattr->prev == NULL)
120
+ return Qnil;
121
+ else
122
+ return rxml_attr_decl_wrap((xmlAttributePtr)xattr->prev);
123
+ }
124
+
125
+ /*
126
+ * call-seq:
127
+ * attr_decl.value -> "value"
128
+ *
129
+ * Obtain the default value of this attribute declaration.
130
+ */
131
+ VALUE rxml_attr_decl_value_get(VALUE self)
132
+ {
133
+ xmlAttributePtr xattr;
134
+
135
+ Data_Get_Struct(self, xmlAttribute, xattr);
136
+
137
+ if (xattr->defaultValue)
138
+ return rxml_new_cstr(xattr->defaultValue, NULL);
139
+ else
140
+ return Qnil;
141
+ }
142
+
143
+ void rxml_init_attr_decl(void)
144
+ {
145
+ cXMLAttrDecl = rb_define_class_under(mXML, "AttrDecl", rb_cObject);
146
+ rb_define_method(cXMLAttrDecl, "doc", rxml_attr_decl_doc_get, 0);
147
+ rb_define_method(cXMLAttrDecl, "name", rxml_attr_decl_name_get, 0);
148
+ rb_define_method(cXMLAttrDecl, "next", rxml_attr_decl_next_get, 0);
149
+ rb_define_method(cXMLAttrDecl, "node_type", rxml_attr_decl_node_type, 0);
150
+ rb_define_method(cXMLAttrDecl, "parent", rxml_attr_decl_parent_get, 0);
151
+ rb_define_method(cXMLAttrDecl, "prev", rxml_attr_decl_prev_get, 0);
152
+ rb_define_method(cXMLAttrDecl, "value", rxml_attr_decl_value_get, 0);
153
+ }
@@ -1,11 +1,11 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_ATTR_DECL__
4
- #define __RXML_ATTR_DECL__
5
-
6
- extern VALUE cXMLAttrDecl;
7
-
8
- void rxml_init_attr_decl(void);
9
- VALUE rxml_attr_decl_wrap(xmlAttributePtr xattribute);
10
- VALUE rxml_attr_decl_value_get(VALUE self);
11
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_ATTR_DECL__
4
+ #define __RXML_ATTR_DECL__
5
+
6
+ extern VALUE cXMLAttrDecl;
7
+
8
+ void rxml_init_attr_decl(void);
9
+ VALUE rxml_attr_decl_wrap(xmlAttributePtr xattribute);
10
+ VALUE rxml_attr_decl_value_get(VALUE self);
11
+ #endif
@@ -1,275 +1,275 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- /*
4
- * Document-class: LibXML::XML::Attributes
5
- *
6
- * Provides access to an element's attributes (XML::Attr).
7
- *
8
- * Basic Usage:
9
- * require 'test_helper'
10
- *
11
- * doc = XML::Document.new(<some_file>)
12
- * attributes = doc.root.attributes
13
- *
14
- * attributes.each do |attribute|
15
- * ..
16
- * end
17
- *
18
- * attributes['foo'] = 'bar'
19
- * attribute = attributes.get_attribute['foo']
20
- * attribute.value == 'foo'
21
- *
22
- * To access a namespaced attribute:
23
- *
24
- * XLINK_URI = 'http://www.w3.org/1999/xlink'
25
- *
26
- * attribute = attributes.get_attribute_ns(XLINK_URI, 'title')
27
- * attribute.value = 'My title'
28
- */
29
-
30
- #include "ruby_libxml.h"
31
- #include "ruby_xml_attributes.h"
32
-
33
- VALUE cXMLAttributes;
34
-
35
- void rxml_attributes_mark(xmlNodePtr xnode)
36
- {
37
- rxml_node_mark(xnode);
38
- }
39
-
40
- /*
41
- * Creates a new attributes instance. Not exposed to ruby.
42
- */
43
- VALUE rxml_attributes_new(xmlNodePtr xnode)
44
- {
45
- return Data_Wrap_Struct(cXMLAttributes, rxml_attributes_mark, NULL, xnode);
46
- }
47
-
48
- /*
49
- * call-seq:
50
- * attributes.node -> XML::Node
51
- *
52
- * Return the node that owns this attributes list.
53
- *
54
- * doc.root.attributes.node == doc.root
55
- */
56
- VALUE rxml_attributes_node_get(VALUE self)
57
- {
58
- xmlNodePtr xnode;
59
- Data_Get_Struct(self, xmlNode, xnode);
60
- return rxml_node_wrap(xnode);
61
- }
62
-
63
- /*
64
- * call-seq:
65
- * attributes.get_attribute("name") -> (XML::Attr | XML::AtrrDecl)
66
- *
67
- * Returns the specified attribute. If the attribute does not
68
- * exist but the document has an associated DTD that defines
69
- * a default value for the attribute, then a XML::AttrDecl is
70
- * returned.
71
- *
72
- * name: The name of the attribute, not including a namespace.
73
- *
74
- * doc.root.attributes.get_attribute("foo")
75
- */
76
- static VALUE rxml_attributes_get_attribute(VALUE self, VALUE name)
77
- {
78
- xmlNodePtr xnode;
79
- xmlAttrPtr xattr;
80
-
81
- name = rb_obj_as_string(name);
82
-
83
- Data_Get_Struct(self, xmlNode, xnode);
84
-
85
- xattr = xmlHasProp(xnode, (xmlChar*) StringValuePtr(name));
86
-
87
- if (!xattr)
88
- return Qnil;
89
- else if (xattr->type == XML_ATTRIBUTE_DECL)
90
- return rxml_attr_decl_wrap((xmlAttributePtr)xattr);
91
- else
92
- return rxml_attr_wrap(xattr);
93
- }
94
-
95
- /*
96
- * call-seq:
97
- * attributes.get_attribute_ns("namespace", "name") -> (XML::Attr | XML::AtrrDecl)
98
- *
99
- * Returns the specified attribute. If the attribute does not
100
- * exist but the document has an associated DTD that defines
101
- * a default value for the attribute, then a XML::AttrDecl is
102
- * returned.
103
- *
104
- * namespace: The URI of the attribute's namespace.
105
- * name: The name of the attribute, not including a namespace.
106
- *
107
- * doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
108
- */
109
- static VALUE rxml_attributes_get_attribute_ns(VALUE self, VALUE namespace,
110
- VALUE name)
111
- {
112
- xmlNodePtr xnode;
113
- xmlAttrPtr xattr;
114
-
115
- name = rb_obj_as_string(name);
116
-
117
- Data_Get_Struct(self, xmlNode, xnode);
118
-
119
- xattr = xmlHasNsProp(xnode, (xmlChar*) StringValuePtr(name),
120
- (xmlChar*) StringValuePtr(namespace));
121
-
122
- if (!xattr)
123
- return Qnil;
124
- else if (xattr->type == XML_ATTRIBUTE_DECL)
125
- return rxml_attr_decl_wrap((xmlAttributePtr)xattr);
126
- else
127
- return rxml_attr_wrap(xattr);
128
- }
129
-
130
- /*
131
- * call-seq:
132
- * attributes["name"] -> String
133
- *
134
- * Fetches an attribute value. If you want to access the underlying
135
- * Attribute itself use get_attribute.
136
- *
137
- * name: The name of the attribute, not including any namespaces.
138
- *
139
- * doc.root.attributes['att'] -> 'some value'
140
- */
141
- VALUE rxml_attributes_attribute_get(VALUE self, VALUE name)
142
- {
143
- VALUE xattr = rxml_attributes_get_attribute(self, name);
144
-
145
- if (NIL_P(xattr))
146
- return Qnil;
147
- else
148
- return rxml_attr_value_get(xattr);
149
- }
150
-
151
- /*
152
- * call-seq:
153
- * attributes["name"] = "value"
154
- *
155
- * Sets an attribute value. If you want to get the Attribute itself,
156
- * use get_attribute.
157
- *
158
- * name: The name of the attribute, not including any namespaces.
159
- * value: The new value of the namespace.
160
- *
161
- * doc.root.attributes['att'] = 'some value'
162
- */
163
- VALUE rxml_attributes_attribute_set(VALUE self, VALUE name, VALUE value)
164
- {
165
- VALUE xattr = rxml_attributes_get_attribute(self, name);
166
- if (NIL_P(xattr))
167
- {
168
- VALUE args[3];
169
-
170
- args[0] = rxml_attributes_node_get(self);
171
- args[1] = name;
172
- args[2] = value;
173
-
174
- return rb_class_new_instance(sizeof(args)/sizeof(VALUE), args, cXMLAttr);
175
- }
176
- else
177
- {
178
- return rxml_attr_value_set(xattr, value);
179
- }
180
- }
181
-
182
- /*
183
- * call-seq:
184
- * attributes.each {block} -> XML::Attr
185
- *
186
- * Iterates over each attribute.
187
- *
188
- * doc.root.attributes.each {|attribute| puts attribute.name}
189
- */
190
- static VALUE rxml_attributes_each(VALUE self)
191
- {
192
- xmlNodePtr xnode;
193
- xmlAttrPtr xattr;
194
- Data_Get_Struct(self, xmlNode, xnode);
195
-
196
- xattr = xnode->properties;
197
-
198
- while (xattr)
199
- {
200
- /* Get the next attribute while we still can - the user
201
- may remove the yielded attribute. */
202
- xmlAttrPtr next = xattr->next;
203
-
204
- VALUE attr = rxml_attr_wrap(xattr);
205
- rb_yield(attr);
206
- xattr = next;
207
- }
208
-
209
- return self;
210
- }
211
-
212
- /*
213
- * call-seq:
214
- * attributes.length -> Integer
215
- *
216
- * Returns the number of attributes.
217
- *
218
- * doc.root.attributes.length
219
- */
220
- static VALUE rxml_attributes_length(VALUE self)
221
- {
222
- int length = 0;
223
- xmlNodePtr xnode;
224
- xmlAttrPtr xattr;
225
- Data_Get_Struct(self, xmlNode, xnode);
226
-
227
- xattr = xnode->properties;
228
-
229
- while (xattr)
230
- {
231
- length++;
232
- xattr = xattr->next;
233
- }
234
-
235
- return INT2NUM(length);
236
- }
237
-
238
- /*
239
- * call-seq:
240
- * attributes.first -> XML::Attr
241
- *
242
- * Returns the first attribute.
243
- *
244
- * doc.root.attributes.first
245
- */
246
- static VALUE rxml_attributes_first(VALUE self)
247
- {
248
- xmlNodePtr xnode;
249
- Data_Get_Struct(self, xmlNode, xnode);
250
-
251
- if (xnode->type == XML_ELEMENT_NODE)
252
- {
253
- xmlAttrPtr xattr = xnode->properties;
254
-
255
- if (xattr)
256
- {
257
- return rxml_attr_wrap(xattr);
258
- }
259
- }
260
- return Qnil;
261
- }
262
-
263
- void rxml_init_attributes(void)
264
- {
265
- cXMLAttributes = rb_define_class_under(mXML, "Attributes", rb_cObject);
266
- rb_include_module(cXMLAttributes, rb_mEnumerable);
267
- rb_define_method(cXMLAttributes, "node", rxml_attributes_node_get, 0);
268
- rb_define_method(cXMLAttributes, "get_attribute", rxml_attributes_get_attribute, 1);
269
- rb_define_method(cXMLAttributes, "get_attribute_ns", rxml_attributes_get_attribute_ns, 2);
270
- rb_define_method(cXMLAttributes, "[]", rxml_attributes_attribute_get, 1);
271
- rb_define_method(cXMLAttributes, "[]=", rxml_attributes_attribute_set, 2);
272
- rb_define_method(cXMLAttributes, "each", rxml_attributes_each, 0);
273
- rb_define_method(cXMLAttributes, "length", rxml_attributes_length, 0);
274
- rb_define_method(cXMLAttributes, "first", rxml_attributes_first, 0);
275
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ /*
4
+ * Document-class: LibXML::XML::Attributes
5
+ *
6
+ * Provides access to an element's attributes (XML::Attr).
7
+ *
8
+ * Basic Usage:
9
+ * require 'test_helper'
10
+ *
11
+ * doc = XML::Document.new(<some_file>)
12
+ * attributes = doc.root.attributes
13
+ *
14
+ * attributes.each do |attribute|
15
+ * ..
16
+ * end
17
+ *
18
+ * attributes['foo'] = 'bar'
19
+ * attribute = attributes.get_attribute['foo']
20
+ * attribute.value == 'foo'
21
+ *
22
+ * To access a namespaced attribute:
23
+ *
24
+ * XLINK_URI = 'http://www.w3.org/1999/xlink'
25
+ *
26
+ * attribute = attributes.get_attribute_ns(XLINK_URI, 'title')
27
+ * attribute.value = 'My title'
28
+ */
29
+
30
+ #include "ruby_libxml.h"
31
+ #include "ruby_xml_attributes.h"
32
+
33
+ VALUE cXMLAttributes;
34
+
35
+ void rxml_attributes_mark(xmlNodePtr xnode)
36
+ {
37
+ rxml_node_mark(xnode);
38
+ }
39
+
40
+ /*
41
+ * Creates a new attributes instance. Not exposed to ruby.
42
+ */
43
+ VALUE rxml_attributes_new(xmlNodePtr xnode)
44
+ {
45
+ return Data_Wrap_Struct(cXMLAttributes, rxml_attributes_mark, NULL, xnode);
46
+ }
47
+
48
+ /*
49
+ * call-seq:
50
+ * attributes.node -> XML::Node
51
+ *
52
+ * Return the node that owns this attributes list.
53
+ *
54
+ * doc.root.attributes.node == doc.root
55
+ */
56
+ VALUE rxml_attributes_node_get(VALUE self)
57
+ {
58
+ xmlNodePtr xnode;
59
+ Data_Get_Struct(self, xmlNode, xnode);
60
+ return rxml_node_wrap(xnode);
61
+ }
62
+
63
+ /*
64
+ * call-seq:
65
+ * attributes.get_attribute("name") -> (XML::Attr | XML::AtrrDecl)
66
+ *
67
+ * Returns the specified attribute. If the attribute does not
68
+ * exist but the document has an associated DTD that defines
69
+ * a default value for the attribute, then a XML::AttrDecl is
70
+ * returned.
71
+ *
72
+ * name: The name of the attribute, not including a namespace.
73
+ *
74
+ * doc.root.attributes.get_attribute("foo")
75
+ */
76
+ static VALUE rxml_attributes_get_attribute(VALUE self, VALUE name)
77
+ {
78
+ xmlNodePtr xnode;
79
+ xmlAttrPtr xattr;
80
+
81
+ name = rb_obj_as_string(name);
82
+
83
+ Data_Get_Struct(self, xmlNode, xnode);
84
+
85
+ xattr = xmlHasProp(xnode, (xmlChar*) StringValuePtr(name));
86
+
87
+ if (!xattr)
88
+ return Qnil;
89
+ else if (xattr->type == XML_ATTRIBUTE_DECL)
90
+ return rxml_attr_decl_wrap((xmlAttributePtr)xattr);
91
+ else
92
+ return rxml_attr_wrap(xattr);
93
+ }
94
+
95
+ /*
96
+ * call-seq:
97
+ * attributes.get_attribute_ns("namespace", "name") -> (XML::Attr | XML::AtrrDecl)
98
+ *
99
+ * Returns the specified attribute. If the attribute does not
100
+ * exist but the document has an associated DTD that defines
101
+ * a default value for the attribute, then a XML::AttrDecl is
102
+ * returned.
103
+ *
104
+ * namespace: The URI of the attribute's namespace.
105
+ * name: The name of the attribute, not including a namespace.
106
+ *
107
+ * doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
108
+ */
109
+ static VALUE rxml_attributes_get_attribute_ns(VALUE self, VALUE namespace,
110
+ VALUE name)
111
+ {
112
+ xmlNodePtr xnode;
113
+ xmlAttrPtr xattr;
114
+
115
+ name = rb_obj_as_string(name);
116
+
117
+ Data_Get_Struct(self, xmlNode, xnode);
118
+
119
+ xattr = xmlHasNsProp(xnode, (xmlChar*) StringValuePtr(name),
120
+ (xmlChar*) StringValuePtr(namespace));
121
+
122
+ if (!xattr)
123
+ return Qnil;
124
+ else if (xattr->type == XML_ATTRIBUTE_DECL)
125
+ return rxml_attr_decl_wrap((xmlAttributePtr)xattr);
126
+ else
127
+ return rxml_attr_wrap(xattr);
128
+ }
129
+
130
+ /*
131
+ * call-seq:
132
+ * attributes["name"] -> String
133
+ *
134
+ * Fetches an attribute value. If you want to access the underlying
135
+ * Attribute itself use get_attribute.
136
+ *
137
+ * name: The name of the attribute, not including any namespaces.
138
+ *
139
+ * doc.root.attributes['att'] -> 'some value'
140
+ */
141
+ VALUE rxml_attributes_attribute_get(VALUE self, VALUE name)
142
+ {
143
+ VALUE xattr = rxml_attributes_get_attribute(self, name);
144
+
145
+ if (NIL_P(xattr))
146
+ return Qnil;
147
+ else
148
+ return rxml_attr_value_get(xattr);
149
+ }
150
+
151
+ /*
152
+ * call-seq:
153
+ * attributes["name"] = "value"
154
+ *
155
+ * Sets an attribute value. If you want to get the Attribute itself,
156
+ * use get_attribute.
157
+ *
158
+ * name: The name of the attribute, not including any namespaces.
159
+ * value: The new value of the namespace.
160
+ *
161
+ * doc.root.attributes['att'] = 'some value'
162
+ */
163
+ VALUE rxml_attributes_attribute_set(VALUE self, VALUE name, VALUE value)
164
+ {
165
+ VALUE xattr = rxml_attributes_get_attribute(self, name);
166
+ if (NIL_P(xattr))
167
+ {
168
+ VALUE args[3];
169
+
170
+ args[0] = rxml_attributes_node_get(self);
171
+ args[1] = name;
172
+ args[2] = value;
173
+
174
+ return rb_class_new_instance(sizeof(args)/sizeof(VALUE), args, cXMLAttr);
175
+ }
176
+ else
177
+ {
178
+ return rxml_attr_value_set(xattr, value);
179
+ }
180
+ }
181
+
182
+ /*
183
+ * call-seq:
184
+ * attributes.each {block} -> XML::Attr
185
+ *
186
+ * Iterates over each attribute.
187
+ *
188
+ * doc.root.attributes.each {|attribute| puts attribute.name}
189
+ */
190
+ static VALUE rxml_attributes_each(VALUE self)
191
+ {
192
+ xmlNodePtr xnode;
193
+ xmlAttrPtr xattr;
194
+ Data_Get_Struct(self, xmlNode, xnode);
195
+
196
+ xattr = xnode->properties;
197
+
198
+ while (xattr)
199
+ {
200
+ /* Get the next attribute while we still can - the user
201
+ may remove the yielded attribute. */
202
+ xmlAttrPtr next = xattr->next;
203
+
204
+ VALUE attr = rxml_attr_wrap(xattr);
205
+ rb_yield(attr);
206
+ xattr = next;
207
+ }
208
+
209
+ return self;
210
+ }
211
+
212
+ /*
213
+ * call-seq:
214
+ * attributes.length -> Integer
215
+ *
216
+ * Returns the number of attributes.
217
+ *
218
+ * doc.root.attributes.length
219
+ */
220
+ static VALUE rxml_attributes_length(VALUE self)
221
+ {
222
+ int length = 0;
223
+ xmlNodePtr xnode;
224
+ xmlAttrPtr xattr;
225
+ Data_Get_Struct(self, xmlNode, xnode);
226
+
227
+ xattr = xnode->properties;
228
+
229
+ while (xattr)
230
+ {
231
+ length++;
232
+ xattr = xattr->next;
233
+ }
234
+
235
+ return INT2NUM(length);
236
+ }
237
+
238
+ /*
239
+ * call-seq:
240
+ * attributes.first -> XML::Attr
241
+ *
242
+ * Returns the first attribute.
243
+ *
244
+ * doc.root.attributes.first
245
+ */
246
+ static VALUE rxml_attributes_first(VALUE self)
247
+ {
248
+ xmlNodePtr xnode;
249
+ Data_Get_Struct(self, xmlNode, xnode);
250
+
251
+ if (xnode->type == XML_ELEMENT_NODE)
252
+ {
253
+ xmlAttrPtr xattr = xnode->properties;
254
+
255
+ if (xattr)
256
+ {
257
+ return rxml_attr_wrap(xattr);
258
+ }
259
+ }
260
+ return Qnil;
261
+ }
262
+
263
+ void rxml_init_attributes(void)
264
+ {
265
+ cXMLAttributes = rb_define_class_under(mXML, "Attributes", rb_cObject);
266
+ rb_include_module(cXMLAttributes, rb_mEnumerable);
267
+ rb_define_method(cXMLAttributes, "node", rxml_attributes_node_get, 0);
268
+ rb_define_method(cXMLAttributes, "get_attribute", rxml_attributes_get_attribute, 1);
269
+ rb_define_method(cXMLAttributes, "get_attribute_ns", rxml_attributes_get_attribute_ns, 2);
270
+ rb_define_method(cXMLAttributes, "[]", rxml_attributes_attribute_get, 1);
271
+ rb_define_method(cXMLAttributes, "[]=", rxml_attributes_attribute_set, 2);
272
+ rb_define_method(cXMLAttributes, "each", rxml_attributes_each, 0);
273
+ rb_define_method(cXMLAttributes, "length", rxml_attributes_length, 0);
274
+ rb_define_method(cXMLAttributes, "first", rxml_attributes_first, 0);
275
+ }