xmlparser 0.6.81
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.
- data/MANIFEST +112 -0
- data/README +697 -0
- data/README.ja +789 -0
- data/Rakefile +34 -0
- data/ext/encoding.h +91 -0
- data/ext/xmlparser/mkrf_conf.rb +28 -0
- data/ext/xmlparser/xmlparser.c +2226 -0
- data/lib/sax.rb +1 -0
- data/lib/saxdriver.rb +1 -0
- data/lib/wget.rb +47 -0
- data/lib/xml/dom/builder-ja.rb +58 -0
- data/lib/xml/dom/builder.rb +310 -0
- data/lib/xml/dom/core.rb +3276 -0
- data/lib/xml/dom/digest.rb +94 -0
- data/lib/xml/dom/visitor.rb +182 -0
- data/lib/xml/dom2/attr.rb +213 -0
- data/lib/xml/dom2/cdatasection.rb +76 -0
- data/lib/xml/dom2/characterdata.rb +177 -0
- data/lib/xml/dom2/comment.rb +81 -0
- data/lib/xml/dom2/core.rb +19 -0
- data/lib/xml/dom2/document.rb +317 -0
- data/lib/xml/dom2/documentfragment.rb +82 -0
- data/lib/xml/dom2/documenttype.rb +102 -0
- data/lib/xml/dom2/dombuilder.rb +277 -0
- data/lib/xml/dom2/dombuilderfilter.rb +12 -0
- data/lib/xml/dom2/domentityresolver.rb +13 -0
- data/lib/xml/dom2/domentityresolverimpl.rb +37 -0
- data/lib/xml/dom2/domexception.rb +95 -0
- data/lib/xml/dom2/domimplementation.rb +61 -0
- data/lib/xml/dom2/dominputsource.rb +29 -0
- data/lib/xml/dom2/element.rb +533 -0
- data/lib/xml/dom2/entity.rb +110 -0
- data/lib/xml/dom2/entityreference.rb +107 -0
- data/lib/xml/dom2/namednodemap.rb +138 -0
- data/lib/xml/dom2/node.rb +587 -0
- data/lib/xml/dom2/nodelist.rb +231 -0
- data/lib/xml/dom2/notation.rb +86 -0
- data/lib/xml/dom2/processinginstruction.rb +155 -0
- data/lib/xml/dom2/text.rb +128 -0
- data/lib/xml/dom2/xpath.rb +398 -0
- data/lib/xml/encoding-ja.rb +42 -0
- data/lib/xml/parser.rb +13 -0
- data/lib/xml/parserns.rb +236 -0
- data/lib/xml/sax.rb +353 -0
- data/lib/xml/saxdriver.rb +370 -0
- data/lib/xml/xpath.rb +3284 -0
- data/lib/xml/xpath.ry +2352 -0
- data/lib/xmldigest.rb +1 -0
- data/lib/xmltree.rb +1 -0
- data/lib/xmltreebuilder.rb +1 -0
- data/lib/xmltreevisitor.rb +1 -0
- metadata +111 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM::DOMEntityResolverImpl
|
3
|
+
## 2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/domentityresolver'
|
7
|
+
require 'xml/dom2/dominputsource'
|
8
|
+
|
9
|
+
module XML
|
10
|
+
module DOM
|
11
|
+
class DOMEntityResolverImpl
|
12
|
+
include DOMEntityResolver
|
13
|
+
|
14
|
+
## replace 'open' by WGET::open
|
15
|
+
begin
|
16
|
+
require 'wget'
|
17
|
+
## include WGET
|
18
|
+
rescue
|
19
|
+
## ignore
|
20
|
+
end
|
21
|
+
|
22
|
+
## DOMInputSource resolveEntity(publicId, systemId)
|
23
|
+
def resolveEntity(publicId, systemId)
|
24
|
+
ret = DOMInputSource.new
|
25
|
+
ret.publicId = publicId
|
26
|
+
ret.systemId = systemId
|
27
|
+
if systemId =~ /file:/
|
28
|
+
ret.byteStream = open(systemId.sub('^file://', ''))
|
29
|
+
else
|
30
|
+
ret.byteStream = WGET::open(systemId)
|
31
|
+
end
|
32
|
+
ret
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
module XML
|
7
|
+
module DOM
|
8
|
+
=begin
|
9
|
+
|
10
|
+
== Class XML::DOM::DOMException
|
11
|
+
|
12
|
+
=== superclass
|
13
|
+
Exception
|
14
|
+
|
15
|
+
DOM exception.
|
16
|
+
=end
|
17
|
+
|
18
|
+
class DOMException<Exception
|
19
|
+
INDEX_SIZE_ERR = 1
|
20
|
+
WSTRING_SIZE_ERR = 2
|
21
|
+
HIERARCHY_REQUEST_ERR = 3
|
22
|
+
WRONG_DOCUMENT_ERR = 4
|
23
|
+
INVALID_NAME_ERR = 5
|
24
|
+
NO_DATA_ALLOWED_ERR = 6
|
25
|
+
NO_MODIFICATION_ALLOWED_ERR = 7
|
26
|
+
NOT_FOUND_ERR = 8
|
27
|
+
NOT_SUPPORTED_ERR = 9
|
28
|
+
INUSE_ATTRIBUTE_ERR = 10
|
29
|
+
|
30
|
+
## [DOM2]
|
31
|
+
INVALID_STATE_ERR = 11
|
32
|
+
SYNTAX_ERR = 12
|
33
|
+
INVALID_MODIFICATION_ERR = 13
|
34
|
+
NAMESPACE_ERR = 14
|
35
|
+
INVALIUD_ACCESS_ERR = 14
|
36
|
+
|
37
|
+
ERRMSG = [
|
38
|
+
"no error",
|
39
|
+
|
40
|
+
"index size",
|
41
|
+
"wstring size",
|
42
|
+
"hierarchy request",
|
43
|
+
"wrong document",
|
44
|
+
"invalid name",
|
45
|
+
"no data allowed",
|
46
|
+
"no modification allowed",
|
47
|
+
"not found",
|
48
|
+
"not supported",
|
49
|
+
"inuse attribute",
|
50
|
+
|
51
|
+
## [DOM2]
|
52
|
+
"invalid state",
|
53
|
+
"syntax error",
|
54
|
+
"invalid modification",
|
55
|
+
"namescape erorr",
|
56
|
+
"invaliud access"
|
57
|
+
]
|
58
|
+
|
59
|
+
=begin
|
60
|
+
=== Class Methods
|
61
|
+
|
62
|
+
--- DOMException.new(code = 0)
|
63
|
+
|
64
|
+
generate DOM exception.
|
65
|
+
=end
|
66
|
+
|
67
|
+
def initialize(code = 0)
|
68
|
+
@code = code
|
69
|
+
end
|
70
|
+
|
71
|
+
=begin
|
72
|
+
=== Methods
|
73
|
+
|
74
|
+
--- DOMException#code()
|
75
|
+
|
76
|
+
return code of exception.
|
77
|
+
|
78
|
+
=end
|
79
|
+
def code
|
80
|
+
@code
|
81
|
+
end
|
82
|
+
|
83
|
+
=begin
|
84
|
+
|
85
|
+
--- DOMException#to_s()
|
86
|
+
|
87
|
+
return the string representation of the error.
|
88
|
+
|
89
|
+
=end
|
90
|
+
def to_s
|
91
|
+
ERRMSG[@code].dup
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/domexception'
|
7
|
+
require 'xml/dom2/dombuilder'
|
8
|
+
require 'xml/dom2/documenttype'
|
9
|
+
require 'singleton'
|
10
|
+
|
11
|
+
module XML
|
12
|
+
module DOM
|
13
|
+
|
14
|
+
=begin
|
15
|
+
== Class XML::DOM::DOMImplementation
|
16
|
+
|
17
|
+
=end
|
18
|
+
class DOMImplementation
|
19
|
+
include Singleton
|
20
|
+
|
21
|
+
=begin
|
22
|
+
--- DOMImplementation#hasFeature(feature, version)
|
23
|
+
|
24
|
+
test if DOM implementation has correct feature and version.
|
25
|
+
|
26
|
+
=end
|
27
|
+
def hasFeature(feature, version)
|
28
|
+
if (feature =~ /^XML$/i || feature =~ /^Core$/i) &&
|
29
|
+
(version.nil? || version == "1.0" || version == "2.0")
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
35
|
+
## [DOM2]
|
36
|
+
def createDocumentType(qname, pubid, sysid)
|
37
|
+
DocumentType.new(qname, pubid, sysid)
|
38
|
+
end
|
39
|
+
|
40
|
+
## [DOM2]
|
41
|
+
def createDocument(nsuri, qname, doctype)
|
42
|
+
raise DOMException.new(DOMException::WRONG_DOCUMENT_ERR) if
|
43
|
+
doctype && doctype.ownerDocument
|
44
|
+
doc = Document.new
|
45
|
+
if doctype
|
46
|
+
doc.appendChild(doctype)
|
47
|
+
doctype.ownerDocument = doc
|
48
|
+
end
|
49
|
+
elem = doc.createElementNS(nsuri, qname)
|
50
|
+
doc.appendChild(elem)
|
51
|
+
doc.implementation = self
|
52
|
+
doc
|
53
|
+
end
|
54
|
+
|
55
|
+
## [DOM3?]
|
56
|
+
def createDOMBuilder
|
57
|
+
XML::DOM::DOMBuilder.new(Document.new)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM::DOMEntityResolver
|
3
|
+
## 2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
module XML
|
7
|
+
module DOM
|
8
|
+
class DOMInputSource
|
9
|
+
def initialize
|
10
|
+
@bstream = nil
|
11
|
+
@cstream = nil
|
12
|
+
@encoding = nil
|
13
|
+
@pubid = nil
|
14
|
+
@sysid = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def byteStream; @bstream; end
|
18
|
+
def byteStream=(stream); @bstream = stream; end
|
19
|
+
def characterStream; @cstream; end
|
20
|
+
def characterStream=(stream); @cstream = stream; end
|
21
|
+
def encoding; @encoding; end
|
22
|
+
def encoding=(enc);@encoding = enc; end
|
23
|
+
def publicId; @pubid; end
|
24
|
+
def publicId=(pubid); @pubid = pubid; end
|
25
|
+
def systemId; @sysid; end
|
26
|
+
def systemId=(sysid); @sysid = sysid; end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,533 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/node'
|
7
|
+
require 'xml/dom2/domexception'
|
8
|
+
require 'xml/dom2/nodelist'
|
9
|
+
require 'xml/dom2/namednodemap'
|
10
|
+
|
11
|
+
module XML
|
12
|
+
module DOM
|
13
|
+
|
14
|
+
=begin
|
15
|
+
== Class XML::DOM::Element
|
16
|
+
|
17
|
+
=== superclass
|
18
|
+
Node
|
19
|
+
|
20
|
+
=end
|
21
|
+
class Element<Node
|
22
|
+
|
23
|
+
=begin
|
24
|
+
=== Class Methods
|
25
|
+
|
26
|
+
--- Element.new(tag = nil, attrs = nil, *children)
|
27
|
+
|
28
|
+
create a new Element.
|
29
|
+
=end
|
30
|
+
## new(tag, attrs, [child1, child2, ...]) or
|
31
|
+
## new(tag, attrs, child1, child2, ...)
|
32
|
+
## tag: String
|
33
|
+
## attrs: Hash, Attr or Array of Attr (or nil)
|
34
|
+
## child?: String or Node
|
35
|
+
def initialize(tag = nil, attr = nil, *children)
|
36
|
+
super(*children)
|
37
|
+
raise "parameter error" if !tag
|
38
|
+
@name = nil
|
39
|
+
@prefix = nil
|
40
|
+
@localname = nil
|
41
|
+
@uri = nil
|
42
|
+
@idAttribute = nil
|
43
|
+
if tag.is_a?(Array)
|
44
|
+
## namespaces
|
45
|
+
raise "parameter error" if tag.length != 2
|
46
|
+
@localname = tag[1]
|
47
|
+
if tag[1].index(':')
|
48
|
+
@prefix, @localname = tag[1].split(':')
|
49
|
+
end
|
50
|
+
@name = tag[1] ## qualified name
|
51
|
+
@uri = tag[0] ## namespace URI
|
52
|
+
else
|
53
|
+
@name = tag
|
54
|
+
end
|
55
|
+
@name.freeze
|
56
|
+
@localname.freeze
|
57
|
+
@uri.freeze
|
58
|
+
@prefix.freeze
|
59
|
+
|
60
|
+
if attr.nil?
|
61
|
+
@attr = NamedNodeMap.new([])
|
62
|
+
elsif attr.is_a?(Hash)
|
63
|
+
nodes = []
|
64
|
+
attr.each do |key, value|
|
65
|
+
nodes.push(Attr.new(key, value))
|
66
|
+
end
|
67
|
+
@attr = NamedNodeMap.new(nodes)
|
68
|
+
elsif attr.is_a?(Array)
|
69
|
+
@attr = NamedNodeMap.new(attr)
|
70
|
+
elsif attr.nodeType == ATTRIBUTE_NODE
|
71
|
+
@attr = NamedNodeMap.new([attr])
|
72
|
+
else
|
73
|
+
raise "parameter error: #{attr}"
|
74
|
+
end
|
75
|
+
@attr.each do |attr|
|
76
|
+
attr.ownerElement = self
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
=begin
|
81
|
+
=== Methods
|
82
|
+
|
83
|
+
--- Element#nodeType()
|
84
|
+
|
85
|
+
[DOM]
|
86
|
+
returns the nodeType.
|
87
|
+
=end
|
88
|
+
## [DOM]
|
89
|
+
def nodeType
|
90
|
+
ELEMENT_NODE
|
91
|
+
end
|
92
|
+
|
93
|
+
=begin
|
94
|
+
--- Element#nodeName()
|
95
|
+
|
96
|
+
[DOM]
|
97
|
+
returns the nodeName.
|
98
|
+
=end
|
99
|
+
## [DOM]
|
100
|
+
def nodeName
|
101
|
+
@name
|
102
|
+
end
|
103
|
+
|
104
|
+
=begin
|
105
|
+
--- Element#attributes()
|
106
|
+
|
107
|
+
[DOM]
|
108
|
+
returns the attributes of this Element.
|
109
|
+
=end
|
110
|
+
## [DOM]
|
111
|
+
def attributes
|
112
|
+
if iterator?
|
113
|
+
@attr.each do |key, value|
|
114
|
+
yield(value)
|
115
|
+
end if @attr
|
116
|
+
else
|
117
|
+
@attr
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def _getNamespaces(parentNamespaces = {}, all = false)
|
122
|
+
if !parentNamespaces
|
123
|
+
parentNamespaces = parentNode._getNamespaces(nil, true)
|
124
|
+
end
|
125
|
+
namespaces = {}
|
126
|
+
attributes.each do |a|
|
127
|
+
namespaces[a.prefix] = a.namespaceURI if a.prefix
|
128
|
+
end
|
129
|
+
if @localname
|
130
|
+
namespaces[@prefix] = @uri
|
131
|
+
end
|
132
|
+
parentNamespaces.each do |prefix, uri|
|
133
|
+
if all
|
134
|
+
if !namespaces.include?(prefix)
|
135
|
+
namespaces[prefix] = uri
|
136
|
+
end
|
137
|
+
else
|
138
|
+
if namespaces[prefix] == parentNamespaces[prefix]
|
139
|
+
namespaces.delete(prefix)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
namespaces
|
144
|
+
end
|
145
|
+
|
146
|
+
=begin
|
147
|
+
--- Element#to_s()
|
148
|
+
|
149
|
+
return the string representation of the Element.
|
150
|
+
=end
|
151
|
+
def to_s
|
152
|
+
attr = ''
|
153
|
+
|
154
|
+
namespaces = {}
|
155
|
+
attributes.each do |a|
|
156
|
+
namespaces[a.prefix] = a.namespaceURI if a.prefix
|
157
|
+
end
|
158
|
+
if @localname
|
159
|
+
namespaces[@prefix] = @uri
|
160
|
+
end
|
161
|
+
|
162
|
+
namespaces.each do |prefix, uri|
|
163
|
+
## skip the namespace declaration of xml or xmlns.
|
164
|
+
next if prefix == 'xml' or
|
165
|
+
uri == 'http://www.w3.org/2000/xmlns/'
|
166
|
+
nsattrname = 'xmlns'
|
167
|
+
nsattrname << ':' + prefix if prefix
|
168
|
+
## skip duplicated namespace declarations.
|
169
|
+
next if @attr.getNamedItem(nsattrname)
|
170
|
+
attr << " #{nsattrname}=\"#{uri}\""
|
171
|
+
end
|
172
|
+
|
173
|
+
@attr.each do |a|
|
174
|
+
attr << ' ' + a.to_s
|
175
|
+
end if @attr
|
176
|
+
content = super
|
177
|
+
if content != ''
|
178
|
+
ret = "<#{@name}#{attr}>#{content}</#{@name}>"
|
179
|
+
else
|
180
|
+
ret = "<#{@name}#{attr}/>"
|
181
|
+
end
|
182
|
+
ret << "\n" if parentNode.nodeType == DOCUMENT_NODE
|
183
|
+
ret
|
184
|
+
end
|
185
|
+
|
186
|
+
=begin
|
187
|
+
--- Element#dump(depth = 0)
|
188
|
+
|
189
|
+
dumps the Element.
|
190
|
+
=end
|
191
|
+
def dump(depth = 0)
|
192
|
+
attr = ''
|
193
|
+
@attr.each do |a| ## self.attributes do |a|
|
194
|
+
attr += a.to_s + ", "
|
195
|
+
end if @attr
|
196
|
+
attr.chop!
|
197
|
+
attr.chop!
|
198
|
+
print ' ' * depth * 2
|
199
|
+
print "#{@name}(#{attr})\n"
|
200
|
+
@children.each do |child|
|
201
|
+
child.dump(depth + 1)
|
202
|
+
end if @children
|
203
|
+
end
|
204
|
+
|
205
|
+
=begin
|
206
|
+
--- Element#tagName()
|
207
|
+
|
208
|
+
[DOM]
|
209
|
+
alias of nodeName.
|
210
|
+
=end
|
211
|
+
## [DOM]
|
212
|
+
alias tagName nodeName
|
213
|
+
|
214
|
+
=begin
|
215
|
+
--- Element#getAttribute(name)
|
216
|
+
|
217
|
+
[DOM]
|
218
|
+
retrieves an attribute value by name.
|
219
|
+
=end
|
220
|
+
## [DOM]
|
221
|
+
def getAttribute(name)
|
222
|
+
attr = getAttributeNode(name)
|
223
|
+
if attr.nil?
|
224
|
+
''
|
225
|
+
else
|
226
|
+
attr.nodeValue
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
=begin
|
231
|
+
--- Element#setAttribute(name, value)
|
232
|
+
|
233
|
+
[DOM]
|
234
|
+
adds a new attribute.
|
235
|
+
=end
|
236
|
+
## [DOM]
|
237
|
+
def setAttribute(name, value)
|
238
|
+
if @ownerElement
|
239
|
+
attr = @ownerDocument.createAttribute(name)
|
240
|
+
attr.appendChild(@ownerDocument.createTextNode(value))
|
241
|
+
else
|
242
|
+
attr = Attr.new(name)
|
243
|
+
attr.appendChild(Text.new(value))
|
244
|
+
end
|
245
|
+
setAttributeNode(attr)
|
246
|
+
end
|
247
|
+
|
248
|
+
=begin
|
249
|
+
--- Element#removeAttribute(name)
|
250
|
+
|
251
|
+
[DOM]
|
252
|
+
remove an attribute by name.
|
253
|
+
=end
|
254
|
+
## [DOM]
|
255
|
+
def removeAttribute(name)
|
256
|
+
ret = getAttributeNode(name)
|
257
|
+
removeAttributeNode(ret) if ret
|
258
|
+
end
|
259
|
+
|
260
|
+
=begin
|
261
|
+
--- Element#getAttributeNode(name)
|
262
|
+
|
263
|
+
[DOM]
|
264
|
+
retrieves an Attr node by name.
|
265
|
+
=end
|
266
|
+
## [DOM]
|
267
|
+
def getAttributeNode(name)
|
268
|
+
@attr.getNamedItem(name)
|
269
|
+
end
|
270
|
+
|
271
|
+
=begin
|
272
|
+
--- Element#setAttributeNode(newAttr)
|
273
|
+
|
274
|
+
[DOM]
|
275
|
+
adds a new attribute.
|
276
|
+
=end
|
277
|
+
## [DOM]
|
278
|
+
def setAttributeNode(newAttr)
|
279
|
+
ret = getAttributeNode(newAttr.nodeName)
|
280
|
+
if ret == newAttr
|
281
|
+
raise DOMException.new(DOMException::INUSE_ATTRIBUTE_ERR)
|
282
|
+
end
|
283
|
+
ret.ownerElement = nil if ret
|
284
|
+
@attr.setNamedItem(newAttr)
|
285
|
+
newAttr.ownerElement = self
|
286
|
+
ret
|
287
|
+
end
|
288
|
+
|
289
|
+
=begin
|
290
|
+
--- Element#removeAttributeNode(oldAttr)
|
291
|
+
|
292
|
+
[DOM]
|
293
|
+
removes the specified attribute.
|
294
|
+
=end
|
295
|
+
## [DOM]
|
296
|
+
def removeAttributeNode(oldAttr)
|
297
|
+
ret = getAttributeNode(oldAttr.nodeName)
|
298
|
+
if ret.nil? || ret != oldAttr
|
299
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR)
|
300
|
+
end
|
301
|
+
@attr.removeNamedItem(oldAttr.nodeName)
|
302
|
+
ret.ownerElement = nil
|
303
|
+
ret
|
304
|
+
end
|
305
|
+
|
306
|
+
=begin
|
307
|
+
--- Element#getElementsByTagName(tagname)
|
308
|
+
|
309
|
+
[DOM]
|
310
|
+
returns a NodeList of all descendant elements with given tag name.
|
311
|
+
=end
|
312
|
+
## [DOM] (but this is not "live")
|
313
|
+
def getElementsByTagName(tagname)
|
314
|
+
ret = NodeList.new
|
315
|
+
@children.each do |node|
|
316
|
+
if node.nodeType == ELEMENT_NODE
|
317
|
+
if tagname == '*' || node.nodeName == tagname
|
318
|
+
ret << node
|
319
|
+
end
|
320
|
+
ret << node.getElementsByTagName(tagname)
|
321
|
+
end
|
322
|
+
end if @children
|
323
|
+
ret
|
324
|
+
end
|
325
|
+
|
326
|
+
|
327
|
+
=begin
|
328
|
+
--- Element#normalize
|
329
|
+
|
330
|
+
[DOM]
|
331
|
+
puts all Text nodes in the full depth of the sub-tree under this
|
332
|
+
Eelemnt.
|
333
|
+
=end
|
334
|
+
## [DOM]
|
335
|
+
def normalize
|
336
|
+
return if @children.nil?
|
337
|
+
old = nil
|
338
|
+
children = @children.to_a.dup
|
339
|
+
children.each do |child|
|
340
|
+
if !old.nil? && old.nodeType == TEXT_NODE &&
|
341
|
+
child.nodeType == TEXT_NODE
|
342
|
+
old.appendData(child.nodeValue)
|
343
|
+
self.removeChild(child)
|
344
|
+
else
|
345
|
+
if child.nodeType == ELEMENT_NODE
|
346
|
+
child.normalize
|
347
|
+
end
|
348
|
+
old = child
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
=begin
|
354
|
+
--- Element#cloneNode(deep = true)
|
355
|
+
|
356
|
+
[DOM]
|
357
|
+
returns the copy of the Element.
|
358
|
+
=end
|
359
|
+
## [DOM]
|
360
|
+
def cloneNode(deep = true)
|
361
|
+
attrs = []
|
362
|
+
@attr.each do |attr|
|
363
|
+
attrs.push(attr.cloneNode(true))
|
364
|
+
end
|
365
|
+
super(deep, @name, attrs)
|
366
|
+
end
|
367
|
+
|
368
|
+
## get the list of nodeValues by IDs
|
369
|
+
## [experimental implement]
|
370
|
+
def _getIDVals(ids = nil)
|
371
|
+
if ids.nil?
|
372
|
+
doc = ownerDocument
|
373
|
+
return [] if doc.nil?
|
374
|
+
ids = doc._getIDAttrs
|
375
|
+
end
|
376
|
+
|
377
|
+
idelem = []
|
378
|
+
if !ids[nodeName].nil?
|
379
|
+
return attributes._getValues(ids[nodeName])
|
380
|
+
elsif !ids['*'].nil?
|
381
|
+
return attributes._getValues(ids['*'])
|
382
|
+
end
|
383
|
+
return []
|
384
|
+
end
|
385
|
+
|
386
|
+
=begin
|
387
|
+
--- Element#trim(preserve = false)
|
388
|
+
|
389
|
+
trim extra whitespaces.
|
390
|
+
=end
|
391
|
+
## trim extra whitespaces
|
392
|
+
## if attribute 'xml:space' is 'preserve',
|
393
|
+
## don't trim any white spaces
|
394
|
+
def trim(preserve = false)
|
395
|
+
if !attributes['xml:space'].nil?
|
396
|
+
value = attributes['xml:space'].nodeValue
|
397
|
+
if value == 'preserve'
|
398
|
+
preserve = true
|
399
|
+
elsif value == 'default'
|
400
|
+
preserve = false
|
401
|
+
end
|
402
|
+
end
|
403
|
+
return nil if @children.nil?
|
404
|
+
children = @children.to_a.dup
|
405
|
+
children.each do |child|
|
406
|
+
if !preserve && (child.nodeType == TEXT_NODE ||
|
407
|
+
child.nodeType == CDATA_SECTION_NODE)
|
408
|
+
if child.trim == ""
|
409
|
+
self.removeChild(child)
|
410
|
+
end
|
411
|
+
else
|
412
|
+
child.trim(preserve)
|
413
|
+
end
|
414
|
+
end
|
415
|
+
nil
|
416
|
+
end
|
417
|
+
|
418
|
+
## [DOM2]
|
419
|
+
def namespaceURI; @uri; end
|
420
|
+
|
421
|
+
## [DOM2]
|
422
|
+
def prefix; @prefix; end
|
423
|
+
|
424
|
+
## [DOM2]
|
425
|
+
def prefix=(prefix);
|
426
|
+
## to be checked
|
427
|
+
@prefix = prefix
|
428
|
+
@name = @prefix + ':' + @localname
|
429
|
+
@prefix.freeze
|
430
|
+
@name.freeze
|
431
|
+
end
|
432
|
+
|
433
|
+
## [DOM2]
|
434
|
+
def localname; @localname; end
|
435
|
+
|
436
|
+
## [DOM2]
|
437
|
+
def hasAttributes()
|
438
|
+
attributes.length > 0
|
439
|
+
end
|
440
|
+
|
441
|
+
## [DOM2]
|
442
|
+
def getAttributeNS(nsuri, localname)
|
443
|
+
attr = getAttributeNodeNS(nsuri, localname)
|
444
|
+
if attr.nil?
|
445
|
+
""
|
446
|
+
else
|
447
|
+
attr.nodeValue
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
## [DOM2]
|
452
|
+
def setAttributeNS(nsuri, qname, value)
|
453
|
+
if qname.index(':')
|
454
|
+
prefix, localname = qname.split(':')
|
455
|
+
raise DOMException.new(DOMException::NAMESPACE_ERR) if
|
456
|
+
nsuri.nil? or
|
457
|
+
(prefix == 'xml' and
|
458
|
+
nsuri != 'http://www.w3.org/XML/1998/namespace')
|
459
|
+
else
|
460
|
+
raise DOMException.new(DOMException::NAMESPACE_ERR) if
|
461
|
+
qname == 'xmlns' and
|
462
|
+
nsuri != 'http://www.w3.org/2000/xmlns/'
|
463
|
+
end
|
464
|
+
attr = @ownerDocument.createAttributeNS(nsuri, qname)
|
465
|
+
attr.appendChild(@ownerDocument.createTextNode(value))
|
466
|
+
setAttributeNodeNS(attr)
|
467
|
+
end
|
468
|
+
|
469
|
+
## [DOM2]
|
470
|
+
def removeAttributeNS(nsuri, localname)
|
471
|
+
ret = getAttributeNodeNS(nsuri, localname)
|
472
|
+
removeAttributeNode(ret) if ret
|
473
|
+
end
|
474
|
+
|
475
|
+
## [DOM2]
|
476
|
+
def getAttributeNodeNS(nsuri, localname)
|
477
|
+
attributes.each do |attr|
|
478
|
+
return attr if
|
479
|
+
attr.namespaceURI == nsuri && attr.localname == localname
|
480
|
+
end
|
481
|
+
nil
|
482
|
+
end
|
483
|
+
|
484
|
+
## [DOM2]
|
485
|
+
def setAttributeNodeNS(newAttr)
|
486
|
+
ret = getAttributeNodeNS(newAttr.namespaceURI, newAttr.localname)
|
487
|
+
removeAttributeNode(ret) if ret
|
488
|
+
setAttributeNode(newAttr)
|
489
|
+
ret
|
490
|
+
end
|
491
|
+
|
492
|
+
## [DOM2]
|
493
|
+
def getElementsByTagNameNS(nsuri, localname)
|
494
|
+
ret = NodeList.new
|
495
|
+
@children.each do |node|
|
496
|
+
if node.nodeType == ELEMENT_NODE
|
497
|
+
if (localname == '*' || node.localname == localname) and
|
498
|
+
(nsuri == '*' || node.namespaceURI == nsuri)
|
499
|
+
ret << node
|
500
|
+
end
|
501
|
+
ret << node.getElementsByTagNameNS(nsuri, localname)
|
502
|
+
end
|
503
|
+
end if @children
|
504
|
+
ret
|
505
|
+
end
|
506
|
+
|
507
|
+
## [DOM2]
|
508
|
+
def hasAttribute(name)
|
509
|
+
!getAttributeNode(name).nil?
|
510
|
+
end
|
511
|
+
|
512
|
+
## [DOM2]
|
513
|
+
def hasAttributeNS(nsuri, localname)
|
514
|
+
!getAttributeNodeNS(nsuri, localname).nil?
|
515
|
+
end
|
516
|
+
|
517
|
+
def idAttribute; @idAttribute; end
|
518
|
+
def idAttribute=(name); @idAttribute = name; end
|
519
|
+
|
520
|
+
def _checkNode(node)
|
521
|
+
unless node.nodeType == ELEMENT_NODE ||
|
522
|
+
node.nodeType == TEXT_NODE ||
|
523
|
+
node.nodeType == COMMENT_NODE ||
|
524
|
+
node.nodeType == PROCESSING_INSTRUCTION_NODE ||
|
525
|
+
node.nodeType == CDATA_SECTION_NODE ||
|
526
|
+
node.nodeType == ENTITY_REFERENCE_NODE
|
527
|
+
raise DOMException.new(DOMException::HIERARCHY_REQUEST_ERR)
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
end
|
532
|
+
end
|
533
|
+
end
|