xml-smart 0.4.0 → 0.4.4
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.
- checksums.yaml +4 -4
- data/example/CARD.xml +64 -0
- data/example/{xpath_visual.rb → xpath_visual} +15 -4
- data/lib/xml/smart.rb +9 -4
- data/lib/xml/smart_dom.rb +10 -10
- data/lib/xml/smart_domattribute.rb +16 -13
- data/lib/xml/smart_domelement.rb +61 -53
- data/lib/xml/smart_domnamespaceset.rb +4 -4
- data/lib/xml/smart_domother.rb +3 -3
- data/lib/xml/smart_domtext.rb +10 -10
- data/lib/xml/smart_processinginstruction.rb +10 -10
- data/test/EXAMPLE.xml +1 -1
- data/test/tc_namespace_default.rb +6 -6
- data/xml-smart.gemspec +3 -1
- metadata +40 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0082580453384e4fc3faf5b355f6aa8ce68d77e620fc520b4712659190e900b1'
|
4
|
+
data.tar.gz: 6e690294fe78c3d3a28f7be10a147f498ec0775a324ae63c02e786ed35972e55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a009c08c31957a69772a05764ab7334ce878d6d009f779c248715fb4cd40595f034b4cba04d03fb656d20cb31ceaa690e65f265d98a7cba54f7af625b78b1ba2
|
7
|
+
data.tar.gz: 94475b9125ff888bf800e6e466b99892833de16d99f0b5417f995853454c66e7987f5070f5650983f02f468a3154a20b90a35f7e578b80dda42827a33cb10b9e
|
data/example/CARD.xml
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<hipster_kitchen>
|
3
|
+
<dish_of_the_day day="Mo" type="meat">
|
4
|
+
<name>QUICHE LORRAINE</name>
|
5
|
+
<alergens>
|
6
|
+
<alergen>a</alergen>
|
7
|
+
<alergen>c</alergen>
|
8
|
+
<alergen>g</alergen>
|
9
|
+
<alergen>l</alergen>
|
10
|
+
</alergens>
|
11
|
+
</dish_of_the_day>
|
12
|
+
<dish_of_the_day day="Di" type="vegetarian">
|
13
|
+
<name>MAROKKANISCHER COUSCOUS</name>
|
14
|
+
<alergens>
|
15
|
+
<alergen>a</alergen>
|
16
|
+
<alergen>gl</alergen>
|
17
|
+
</alergens>
|
18
|
+
</dish_of_the_day>
|
19
|
+
<dish_of_the_day day="Mi" type="meat">
|
20
|
+
<name>ASIATISCHE HÜHNERSPIESSE</name>
|
21
|
+
<alergens>
|
22
|
+
<alergen>gl</alergen>
|
23
|
+
<alergen>lf</alergen>
|
24
|
+
<alergen>f</alergen>
|
25
|
+
<alergen>m</alergen>
|
26
|
+
<alergen>o</alergen>
|
27
|
+
</alergens>
|
28
|
+
</dish_of_the_day>
|
29
|
+
<dish_of_the_day day="Fr" type="vegetarian">
|
30
|
+
<name>ITALIENISCHES ANTIPASTIPI</name>
|
31
|
+
<alergens>
|
32
|
+
<alergen maybe="true">a</alergen>
|
33
|
+
<alergen>g</alergen>
|
34
|
+
<alergen>h</alergen>
|
35
|
+
<alergen>l</alergen>
|
36
|
+
</alergens>
|
37
|
+
</dish_of_the_day>
|
38
|
+
<dish_of_the_day type="vegan">
|
39
|
+
<name>SOMMER-CURRY</name>
|
40
|
+
<alergens>
|
41
|
+
<alergen>gl</alergen>
|
42
|
+
<alergen>lf</alergen>
|
43
|
+
<alergen>l</alergen>
|
44
|
+
</alergens>
|
45
|
+
</dish_of_the_day>
|
46
|
+
<alergenes>
|
47
|
+
<alergene id="gl">glutenfrei</alergene>
|
48
|
+
<alergene id="lf">lactosefrei</alergene>
|
49
|
+
<alergene id="a">glutenhaltiges getreide</alergene>
|
50
|
+
<alergene id="b">krebstiere & daraus gewonnene erzeugnisse</alergene>
|
51
|
+
<alergene id="c">ei von geflügel & daraus gewonnene erzeugnisse</alergene>
|
52
|
+
<alergene id="d">fisch & daraus gewonnene erzeugnisse</alergene>
|
53
|
+
<alergene id="e">erdnuss & daraus gewonnene erzeugnisse</alergene>
|
54
|
+
<alergene id="f">soja & daraus gewonnene erzeugnisse</alergene>
|
55
|
+
<alergene id="g">milch von säugetieren wie kuh, schaf, ziege, pferd & esel & daraus gewonnene erzeugnisse</alergene>
|
56
|
+
<alergene id="h">schalenfrüchte</alergene>
|
57
|
+
<alergene id="l">sellerie</alergene>
|
58
|
+
<alergene id="m">senf & daraus gewonnene erzeugnisse</alergene>
|
59
|
+
<alergene id="n">sesam & daraus gewonnene erzeugnisse</alergene>
|
60
|
+
<alergene id="o">sulfit</alergene>
|
61
|
+
<alergene id="p">lupinen & daraus gewonnene erzeugnisse</alergene>
|
62
|
+
<alergene id="r">weichtiere wie z.b.: muscheln, austern, schnecken & daraus gewonnene erzeugnisse</alergene>
|
63
|
+
</alergenes>
|
64
|
+
</hipster_kitchen>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
require 'rubygems'
|
3
3
|
require 'term/ansicolor'
|
4
|
-
|
4
|
+
require_relative "../lib/xml/smart"
|
5
5
|
include Term::ANSIColor
|
6
6
|
|
7
7
|
def rememberPath(path,output)
|
@@ -30,10 +30,21 @@ def prnTree(node,depth,mixed)
|
|
30
30
|
print "\n" unless mixed
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
def help
|
34
|
+
puts "Usage: xpath_visual FILE \"XPATH\""
|
35
|
+
exit
|
36
|
+
end
|
34
37
|
|
35
|
-
|
36
|
-
|
38
|
+
if ARGV.length < 2
|
39
|
+
help
|
40
|
+
else
|
41
|
+
# xpath expression that should be visualised
|
42
|
+
xpath = ARGV[1..-1].join(' ') || "/"
|
43
|
+
unless File.exists?(ARGV[0])
|
44
|
+
help
|
45
|
+
end
|
46
|
+
doc = XML::Smart.open_unprotected(ARGV[0])
|
47
|
+
end
|
37
48
|
|
38
49
|
# remember pathes, that an xpath expression selects
|
39
50
|
@remember = []
|
data/lib/xml/smart.rb
CHANGED
@@ -103,7 +103,7 @@ module Nokogiri
|
|
103
103
|
ctx.evaluate('.//xi:include').each do |ele|
|
104
104
|
name = ele.attributes['href'].value
|
105
105
|
name = path + name if name !~ /^(https?:|ftp:|\/)/
|
106
|
-
content = open(name
|
106
|
+
content = open(name,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read
|
107
107
|
insert = begin
|
108
108
|
Nokogiri::XML::parse(content).root # {|config| config.noblanks.noent.strict }.root
|
109
109
|
rescue
|
@@ -164,14 +164,14 @@ module XML
|
|
164
164
|
begin
|
165
165
|
if name.is_a?(String) && File.exist?(name)
|
166
166
|
MUTEX.synchronize do
|
167
|
-
io = ::
|
167
|
+
io = ::URI::open(name,'r+')
|
168
168
|
io.flock(File::LOCK_EX)
|
169
169
|
end
|
170
170
|
dom = Dom.new Nokogiri::XML::parse(io){|config| config.noblanks.noent.nsclean.strict }, name
|
171
171
|
io.rewind
|
172
172
|
elsif name.is_a?(String) && !File.exist?(name)
|
173
173
|
MUTEX.synchronize do
|
174
|
-
io = ::
|
174
|
+
io = ::URI::open(name,'w')
|
175
175
|
io.flock(File::LOCK_EX)
|
176
176
|
end
|
177
177
|
dom = Smart::string(default,name)
|
@@ -217,7 +217,7 @@ module XML
|
|
217
217
|
filename = nil
|
218
218
|
io = if name.is_a?(String)
|
219
219
|
filename = name
|
220
|
-
::
|
220
|
+
::URI::open(name)
|
221
221
|
else
|
222
222
|
filename = name.path
|
223
223
|
name
|
@@ -257,4 +257,9 @@ module XML
|
|
257
257
|
|
258
258
|
class Error < RuntimeError; end
|
259
259
|
end
|
260
|
+
|
261
|
+
module Common
|
262
|
+
def self::pretty_path
|
263
|
+
end
|
264
|
+
end
|
260
265
|
end
|
data/lib/xml/smart_dom.rb
CHANGED
@@ -13,7 +13,7 @@ module XML
|
|
13
13
|
Element.new(@dom.root)
|
14
14
|
end
|
15
15
|
def root=(nr)
|
16
|
-
@dom.root.replace(nr.instance_variable_get(:@
|
16
|
+
@dom.root.replace(nr.instance_variable_get(:@node)) if nr.instance_of? Element
|
17
17
|
end
|
18
18
|
|
19
19
|
def find(path)
|
@@ -49,7 +49,7 @@ module XML
|
|
49
49
|
def save_as(name)
|
50
50
|
raise Error, 'first parameter has to be a filename or filehandle' unless name.is_a?(String) || name.is_a?(IO) || name.is_a?(Tempfile)
|
51
51
|
begin
|
52
|
-
io = name.is_a?(String) ? ::
|
52
|
+
io = name.is_a?(String) ? ::URI::open(name,'w') : name
|
53
53
|
rescue
|
54
54
|
raise Error, "could not open #{name}"
|
55
55
|
end
|
@@ -70,20 +70,20 @@ module XML
|
|
70
70
|
|
71
71
|
def xinclude!(basedir=nil)
|
72
72
|
Element.new(@dom.root).xinclude!(basedir)
|
73
|
-
end
|
73
|
+
end
|
74
74
|
|
75
75
|
def self::smart_helper(node)
|
76
76
|
if node.instance_of? Nokogiri::XML::Element
|
77
77
|
XML::Smart::Dom::Element.new(node)
|
78
78
|
elsif node.instance_of? Nokogiri::XML::Attr
|
79
79
|
XML::Smart::Dom::Attribute.new(node)
|
80
|
-
elsif node.instance_of? Nokogiri::XML::NodeSet
|
80
|
+
elsif node.instance_of? Nokogiri::XML::NodeSet
|
81
81
|
XML::Smart::Dom::NodeSet.new(node)
|
82
|
-
elsif node.instance_of?(String) || node.instance_of?(TrueClass) || node.instance_of?(FalseClass) || node.instance_of?(Float)
|
82
|
+
elsif node.instance_of?(String) || node.instance_of?(TrueClass) || node.instance_of?(FalseClass) || node.instance_of?(Float)
|
83
83
|
node
|
84
|
-
elsif node.instance_of? Nokogiri::XML::Text
|
84
|
+
elsif node.instance_of? Nokogiri::XML::Text
|
85
85
|
XML::Smart::Dom::Text.new(node)
|
86
|
-
elsif node.instance_of? Nokogiri::XML::Namespace
|
86
|
+
elsif node.instance_of? Nokogiri::XML::Namespace
|
87
87
|
XML::Smart::Dom::Namespace.new(node)
|
88
88
|
elsif node.instance_of? Nokogiri::XML::Document
|
89
89
|
XML::Smart::Dom.new(node)
|
@@ -93,7 +93,7 @@ module XML
|
|
93
93
|
nil
|
94
94
|
else
|
95
95
|
XML::Smart::Dom::Other.new(node)
|
96
|
-
end
|
96
|
+
end
|
97
97
|
end
|
98
98
|
|
99
99
|
def validate_against(doc,&errbl)
|
@@ -114,9 +114,9 @@ module XML
|
|
114
114
|
res = Nokogiri::XSLT::Stylesheet.parse_stylesheet_doc(doc.instance_variable_get(:@dom)).transform(@dom,params)
|
115
115
|
if res.children.length != 0 && res.children.first.class == Nokogiri::XML::Text
|
116
116
|
Text.new(res.children.first).text
|
117
|
-
else
|
117
|
+
else
|
118
118
|
Dom::smart_helper(res)
|
119
|
-
end
|
119
|
+
end
|
120
120
|
end
|
121
121
|
|
122
122
|
end
|
@@ -4,31 +4,34 @@ module XML
|
|
4
4
|
|
5
5
|
class Attribute
|
6
6
|
def initialize(attr)
|
7
|
-
@
|
7
|
+
@node = attr
|
8
8
|
end
|
9
9
|
|
10
10
|
def ===(cls); self.is_a? cls; end
|
11
11
|
|
12
|
-
def to_s; @
|
13
|
-
def to_i; @
|
14
|
-
def to_f; @
|
12
|
+
def to_s; @node.content; end
|
13
|
+
def to_i; @node.content.to_i; end
|
14
|
+
def to_f; @node.content.to_f; end
|
15
15
|
|
16
|
-
def qname; QName.new @
|
17
|
-
def path; @
|
16
|
+
def qname; QName.new @node; end
|
17
|
+
def path; @node.path; end
|
18
18
|
|
19
|
-
def value; @
|
20
|
-
def value=(val); @
|
19
|
+
def value; @node.content; end;
|
20
|
+
def value=(val); @node.content = val; end;
|
21
21
|
|
22
22
|
def ==(other)
|
23
23
|
return false unless other
|
24
24
|
return false unless other.respond_to?(:unique_id)
|
25
25
|
unique_id == other.unique_id
|
26
26
|
end
|
27
|
-
def unique_id; @
|
27
|
+
def unique_id; @node.pointer_id; end
|
28
28
|
|
29
|
-
def parent; Dom::smart_helper(@
|
29
|
+
def parent; Dom::smart_helper(@node.parent); end
|
30
|
+
|
31
|
+
alias :text :value
|
32
|
+
alias :text= :value=
|
30
33
|
end
|
31
34
|
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/xml/smart_domelement.rb
CHANGED
@@ -4,13 +4,13 @@ module XML
|
|
4
4
|
|
5
5
|
class Element
|
6
6
|
def initialize(element)
|
7
|
-
@
|
7
|
+
@node = element
|
8
8
|
end
|
9
9
|
|
10
10
|
def ===(cls); self.is_a? cls; end
|
11
11
|
|
12
12
|
def find(xpath)
|
13
|
-
Dom::smart_helper(@
|
13
|
+
Dom::smart_helper(@node.xpath_fast(xpath))
|
14
14
|
end
|
15
15
|
|
16
16
|
def add_helper(attrs)
|
@@ -20,24 +20,24 @@ module XML
|
|
20
20
|
attrs[0] = attrs[0].dup
|
21
21
|
if attrs[0].sub!(/([^:]+):/, '')
|
22
22
|
pfx = $1
|
23
|
-
if @
|
24
|
-
@
|
25
|
-
if @
|
26
|
-
ns = @
|
23
|
+
if @node.document.user_custom_namespace_prefixes.has_key?(pfx)
|
24
|
+
@node.document.custom_namespace_prefixes.each do |k,v|
|
25
|
+
if @node.document.user_custom_namespace_prefixes[pfx] == v
|
26
|
+
ns = @node.document.user_custom_namespace_prefixes[pfx]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
if ns.nil?
|
31
|
-
if @
|
32
|
-
ns = @
|
31
|
+
if @node.document.custom_namespace_prefixes.has_key?(pfx)
|
32
|
+
ns = @node.document.custom_namespace_prefixes[pfx]
|
33
33
|
else
|
34
34
|
raise Error, 'No valid namespace'
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
tmp = Nokogiri::XML::Node.new attrs[0], @
|
38
|
+
tmp = Nokogiri::XML::Node.new attrs[0], @node.document
|
39
39
|
unless ns.nil?
|
40
|
-
@
|
40
|
+
@node.namespace_scopes.each do |nss|
|
41
41
|
tmp.namespace = nss if nss.href == ns
|
42
42
|
end
|
43
43
|
end
|
@@ -59,13 +59,13 @@ module XML
|
|
59
59
|
end
|
60
60
|
return [tmp,false]
|
61
61
|
elsif attrs.length == 1 && attrs[0].is_a?(XML::Smart::Dom::Element)
|
62
|
-
ele = attrs[0].instance_variable_get(:@
|
63
|
-
same = ele.document.root.pointer_id == @
|
62
|
+
ele = attrs[0].instance_variable_get(:@node)
|
63
|
+
same = ele.document.root.pointer_id == @node.document.root.pointer_id
|
64
64
|
return [same ? ele : ele.dup, !same]
|
65
65
|
elsif attrs.length == 1 && attrs[0].is_a?(XML::Smart::Dom::NodeSet)
|
66
66
|
nos = attrs[0].instance_variable_get(:@nodeset)
|
67
67
|
if nos.length > 0
|
68
|
-
same = nos.first.document.root.pointer_id == @
|
68
|
+
same = nos.first.document.root.pointer_id == @node.document.root.pointer_id
|
69
69
|
if same
|
70
70
|
return [nos, false]
|
71
71
|
else
|
@@ -76,13 +76,13 @@ module XML
|
|
76
76
|
return [nos, false]
|
77
77
|
end
|
78
78
|
elsif attrs.length == 2 && attrs[0].is_a?(XML::Smart::Dom::Element) && (attrs[1] == XML::Smart::COPY || attrs[1] == XML::Smart::MOVE)
|
79
|
-
ele = attrs[0].instance_variable_get(:@
|
80
|
-
same = ele.document.root.pointer_id == @
|
79
|
+
ele = attrs[0].instance_variable_get(:@node)
|
80
|
+
same = ele.document.root.pointer_id == @node.document.root.pointer_id
|
81
81
|
return [attrs[1] == XML::Smart::COPY ? ele.dup : ele, !same]
|
82
82
|
elsif attrs.length == 2 && attrs[0].is_a?(XML::Smart::Dom::NodeSet) && (attrs[1] == XML::Smart::COPY || attrs[1] == XML::Smart::MOVE)
|
83
83
|
nos = attrs[0].instance_variable_get(:@nodeset)
|
84
84
|
if nos.length > 0
|
85
|
-
same = nos.first.document.root.pointer_id == @
|
85
|
+
same = nos.first.document.root.pointer_id == @node.document.root.pointer_id
|
86
86
|
if attrs[1] == XML::Smart::COPY
|
87
87
|
tnos = nos.map{|e|e.dup}
|
88
88
|
nos = Nokogiri::XML::NodeSet.new(nos.first.document,tnos)
|
@@ -92,7 +92,7 @@ module XML
|
|
92
92
|
return [nos, false]
|
93
93
|
end
|
94
94
|
elsif attrs.length == 2 && attrs[0].is_a?(String) && attrs[1].is_a?(String) && attrs[0][0] == '?'
|
95
|
-
tmp = Nokogiri::XML::ProcessingInstruction.new @
|
95
|
+
tmp = Nokogiri::XML::ProcessingInstruction.new @node.document, attrs[0].sub(/./,''), attrs[1]
|
96
96
|
return [tmp,false]
|
97
97
|
end
|
98
98
|
return [nil, false]
|
@@ -100,10 +100,10 @@ module XML
|
|
100
100
|
private :add_helper
|
101
101
|
def add(*attrs)
|
102
102
|
tmp, update = add_helper(attrs)
|
103
|
-
res = Dom::smart_helper(@
|
103
|
+
res = Dom::smart_helper(@node.add_child tmp)
|
104
104
|
if update
|
105
|
-
@
|
106
|
-
@
|
105
|
+
@node.document.custom_namespace_prefixes_update
|
106
|
+
@node.document.ns_update
|
107
107
|
end
|
108
108
|
res
|
109
109
|
end
|
@@ -116,35 +116,35 @@ module XML
|
|
116
116
|
end
|
117
117
|
def add_before(*attrs)
|
118
118
|
tmp, update = add_helper(attrs)
|
119
|
-
res = Dom::smart_helper(@
|
119
|
+
res = Dom::smart_helper(@node.add_previous_sibling tmp)
|
120
120
|
if update
|
121
|
-
@
|
122
|
-
@
|
121
|
+
@node.document.custom_namespace_prefixes_update
|
122
|
+
@node.document.ns_update
|
123
123
|
end
|
124
124
|
res
|
125
125
|
end
|
126
126
|
def add_after(*attrs)
|
127
127
|
tmp, update = add_helper(attrs)
|
128
|
-
res = Dom::smart_helper(@
|
128
|
+
res = Dom::smart_helper(@node.add_next_sibling tmp)
|
129
129
|
if update
|
130
|
-
@
|
131
|
-
@
|
130
|
+
@node.document.custom_namespace_prefixes_update
|
131
|
+
@node.document.ns_update
|
132
132
|
end
|
133
133
|
res
|
134
134
|
end
|
135
135
|
|
136
136
|
def dump
|
137
137
|
doc = Nokogiri::XML::Document.new
|
138
|
-
doc.root = @
|
138
|
+
doc.root = @node
|
139
139
|
doc.root.to_s
|
140
140
|
end
|
141
141
|
|
142
|
-
def to_s; @
|
143
|
-
def to_i; @
|
144
|
-
def to_f; @
|
142
|
+
def to_s; @node.content; end
|
143
|
+
def to_i; @node.content.to_i; end
|
144
|
+
def to_f; @node.content.to_f; end
|
145
145
|
|
146
|
-
def namespace?; !@
|
147
|
-
def namespace; namespace? ? Namespace.new(@
|
146
|
+
def namespace?; !@node.namespace.nil?; end
|
147
|
+
def namespace; namespace? ? Namespace.new(@node.namespace) : nil; end
|
148
148
|
def namespace=(n)
|
149
149
|
n = case n
|
150
150
|
when Namespace
|
@@ -154,67 +154,75 @@ module XML
|
|
154
154
|
else
|
155
155
|
return
|
156
156
|
end
|
157
|
-
tmp = @
|
157
|
+
tmp = @node.document.custom_namespace_prefixes[n] || @node.document.user_custom_namespace_prefixes[n]
|
158
158
|
unless tmp.nil?
|
159
|
-
@
|
160
|
-
@
|
159
|
+
@node.namespace_scopes.each do |nss|
|
160
|
+
@node.namespace = nss if nss.href == tmp
|
161
161
|
end
|
162
162
|
end
|
163
163
|
end
|
164
|
-
def namespaces; NamespaceSet.new(self,@
|
164
|
+
def namespaces; NamespaceSet.new(self,@node); end
|
165
165
|
|
166
166
|
def xinclude!(basedir=nil)
|
167
|
-
@
|
168
|
-
@
|
169
|
-
@
|
167
|
+
@node.do_xinclude_manual(basedir)
|
168
|
+
@node.document.custom_namespace_prefixes_update
|
169
|
+
@node.document.ns_update
|
170
170
|
true
|
171
171
|
end
|
172
172
|
|
173
173
|
def replace_by(n)
|
174
174
|
case n
|
175
|
-
when Element; Element.new @
|
176
|
-
when NodeSet; NodeSet.new @
|
175
|
+
when Element; Element.new @node.replace(n.instance_variable_get(:@node))
|
176
|
+
when NodeSet; NodeSet.new @node.replace(n.instance_variable_get(:@nodeset))
|
177
|
+
else
|
178
|
+
nil
|
179
|
+
end
|
180
|
+
end
|
181
|
+
def replace_by_copy(n)
|
182
|
+
case n
|
183
|
+
when Element; Element.new @node.replace(n.instance_variable_get(:@node).dup)
|
184
|
+
when NodeSet; NodeSet.new @node.replace(n.instance_variable_get(:@nodeset).dup)
|
177
185
|
else
|
178
186
|
nil
|
179
187
|
end
|
180
188
|
end
|
181
189
|
|
182
|
-
def qname; QName.new @
|
183
|
-
def attributes; AttributeSet.new @
|
190
|
+
def qname; QName.new @node; end
|
191
|
+
def attributes; AttributeSet.new @node; end
|
184
192
|
|
185
|
-
def text; @
|
186
|
-
def text=(t); @
|
193
|
+
def text; @node.xpath_fast("string(text())"); end
|
194
|
+
def text=(t); @node.content = t.to_s if t.respond_to? :to_s; end
|
187
195
|
|
188
196
|
def children; find('*|text()'); end
|
189
197
|
def children?; find('*|text()').length > 0 end
|
190
198
|
def parent
|
191
|
-
Dom::smart_helper(@
|
199
|
+
Dom::smart_helper(@node.parent)
|
192
200
|
end
|
193
|
-
def parent?; !@
|
201
|
+
def parent?; !@node.parent.nil?; end
|
194
202
|
|
195
203
|
def empty?; !children?; end
|
196
204
|
def mixed?;
|
197
|
-
@
|
205
|
+
@node.xpath_fast('*').length > 0 && @node.xpath_fast("string(text())") != '';
|
198
206
|
end
|
199
207
|
def text_only?;
|
200
|
-
@
|
208
|
+
@node.xpath_fast('*').length == 0 && @node.xpath_fast("string(text())") != '';
|
201
209
|
end
|
202
210
|
def element_only?;
|
203
|
-
@
|
211
|
+
@node.xpath_fast('*').length > 0 && @node.xpath_fast("string(text())") == '';
|
204
212
|
end
|
205
213
|
|
206
|
-
def path; @
|
214
|
+
def path; @node.path[-1] != ']' ? @node.path + '[1]' : @node.path; end
|
207
215
|
|
208
216
|
def ==(other)
|
209
217
|
return false unless other
|
210
218
|
return false unless other.respond_to?(:unique_id)
|
211
219
|
unique_id == other.unique_id
|
212
220
|
end
|
213
|
-
def unique_id; @
|
221
|
+
def unique_id; @node.pointer_id; end
|
214
222
|
|
215
223
|
def to_doc
|
216
224
|
doc = Nokogiri::XML::Document.new
|
217
|
-
doc.root = @
|
225
|
+
doc.root = @node
|
218
226
|
Dom.new(doc)
|
219
227
|
end
|
220
228
|
end
|
@@ -45,7 +45,7 @@ module XML
|
|
45
45
|
nnew.add(nold.children)
|
46
46
|
nold.replace_by(nnew)
|
47
47
|
@node = nnod
|
48
|
-
@parent.instance_variable_set(:@
|
48
|
+
@parent.instance_variable_set(:@node,@node)
|
49
49
|
@node.document.custom_namespace_prefixes_update
|
50
50
|
@node.document.ns_update
|
51
51
|
Namespace.new(ns)
|
@@ -64,7 +64,7 @@ module XML
|
|
64
64
|
nnew.add(nold.children)
|
65
65
|
nold.replace_by(nnew)
|
66
66
|
@node = nnod
|
67
|
-
@parent.instance_variable_set(:@
|
67
|
+
@parent.instance_variable_set(:@node,@node)
|
68
68
|
@node.document.custom_namespace_prefixes_update
|
69
69
|
@node.document.ns_update
|
70
70
|
nil
|
@@ -92,7 +92,7 @@ module XML
|
|
92
92
|
nnew.add(nold.children)
|
93
93
|
nold.replace_by(nnew)
|
94
94
|
@node = nnod
|
95
|
-
@parent.instance_variable_set(:@
|
95
|
+
@parent.instance_variable_set(:@node,@node)
|
96
96
|
@node.document.custom_namespace_prefixes_update
|
97
97
|
@node.document.ns_update
|
98
98
|
true
|
@@ -115,7 +115,7 @@ module XML
|
|
115
115
|
nnew.add(nold.children)
|
116
116
|
nold.replace_by(nnew)
|
117
117
|
@node = nnod
|
118
|
-
@parent.instance_variable_set(:@
|
118
|
+
@parent.instance_variable_set(:@node,@node)
|
119
119
|
@node.document.custom_namespace_prefixes_update
|
120
120
|
@node.document.ns_update
|
121
121
|
self
|
data/lib/xml/smart_domother.rb
CHANGED
data/lib/xml/smart_domtext.rb
CHANGED
@@ -3,23 +3,23 @@ module XML
|
|
3
3
|
class Dom
|
4
4
|
|
5
5
|
class Text
|
6
|
-
def initialize(text); @
|
6
|
+
def initialize(text); @node = text; end
|
7
7
|
|
8
8
|
def ===(cls); self.is_a? cls; end
|
9
9
|
|
10
10
|
def dump; to_s; end
|
11
|
-
def to_s; @
|
12
|
-
def to_f; @
|
13
|
-
def to_i; @
|
11
|
+
def to_s; @node.content.to_s; end
|
12
|
+
def to_f; @node.content.to_f; end
|
13
|
+
def to_i; @node.content.to_i; end
|
14
14
|
|
15
|
-
def text; @
|
16
|
-
def text=(t); @
|
15
|
+
def text; @node.content; end
|
16
|
+
def text=(t); @node.content = t.to_s if t.respond_to? :to_s; end
|
17
17
|
|
18
|
-
def parent; Node.new(@
|
18
|
+
def parent; Node.new(@node.parent); end
|
19
19
|
|
20
|
-
def path; @
|
20
|
+
def path; @node.path; end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
end
|
24
24
|
end
|
25
|
-
end
|
25
|
+
end
|
@@ -3,39 +3,39 @@ module XML
|
|
3
3
|
|
4
4
|
class ProcessingInstruction
|
5
5
|
def initialize(element)
|
6
|
-
@
|
6
|
+
@node = element
|
7
7
|
end
|
8
8
|
|
9
9
|
def ===(cls); self.is_a? cls; end
|
10
10
|
|
11
|
-
def dump; @
|
11
|
+
def dump; @node.to_s; end
|
12
12
|
|
13
13
|
def replace_by(n)
|
14
14
|
case n
|
15
|
-
when ProcessingInstruction; ProcessingInstruction.new @
|
15
|
+
when ProcessingInstruction; ProcessingInstruction.new @node.replace(n.instance_variable_get(:@node))
|
16
16
|
else
|
17
17
|
nil
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def qname; QName.new @
|
21
|
+
def qname; QName.new @node; end
|
22
22
|
|
23
|
-
def content; @
|
24
|
-
def content=(t); @
|
23
|
+
def content; @node.content end
|
24
|
+
def content=(t); @node.content = t.to_s if t.respond_to? :to_s; end
|
25
25
|
|
26
26
|
def parent
|
27
|
-
Dom::smart_helper(@
|
27
|
+
Dom::smart_helper(@node.parent)
|
28
28
|
end
|
29
|
-
def parent?; !@
|
29
|
+
def parent?; !@node.parent.nil?; end
|
30
30
|
|
31
|
-
def path; @
|
31
|
+
def path; @node.path; end
|
32
32
|
|
33
33
|
def ==(other)
|
34
34
|
return false unless other
|
35
35
|
return false unless other.respond_to?(:unique_id)
|
36
36
|
unique_id == other.unique_id
|
37
37
|
end
|
38
|
-
def unique_id; @
|
38
|
+
def unique_id; @node.pointer_id; end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/test/EXAMPLE.xml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
<test xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xml:lang="de">
|
2
2
|
<names>
|
3
|
-
<name team="0" a="3">
|
3
|
+
<name team="0" a="3">2020-06-05 23:34:48 +0200</name>
|
4
4
|
<name team="1">Jürgen</name>
|
5
5
|
<name team="1">Michel</name>
|
6
6
|
<name team="1">Raphi</name>
|
@@ -12,7 +12,7 @@ class TestNamespaceDefault < Minitest::Test
|
|
12
12
|
assert(doc.namespaces.length == 2)
|
13
13
|
assert(doc.namespaces.key? 'soap')
|
14
14
|
assert(doc.namespaces.key? 'x')
|
15
|
-
|
15
|
+
|
16
16
|
# add an element hallo to root
|
17
17
|
nsnode = doc.root.add("hallo")
|
18
18
|
|
@@ -50,7 +50,7 @@ class TestNamespaceDefault < Minitest::Test
|
|
50
50
|
nsnode.namespaces.add("aaa","http://heise2")
|
51
51
|
|
52
52
|
assert(nsnode.namespaces[nil] == nil)
|
53
|
-
|
53
|
+
|
54
54
|
nsnode.namespaces.add(nil,"http://heise")
|
55
55
|
nsnode.namespaces[nil] = "http://heiser"
|
56
56
|
|
@@ -61,13 +61,13 @@ class TestNamespaceDefault < Minitest::Test
|
|
61
61
|
assert(nsnode.namespaces['xmlns'].href == "http://heiser")
|
62
62
|
assert(nsnode.namespaces['aaa'].href == "http://heise2")
|
63
63
|
assert(nsnode.namespaces['test'].href == "http://heise1")
|
64
|
-
|
64
|
+
|
65
65
|
assert(doc.namespaces.length == 5)
|
66
66
|
nsnode.namespaces.delete_at('aaa')
|
67
67
|
assert(nsnode.namespaces['aaa'].nil?)
|
68
|
-
|
68
|
+
|
69
69
|
assert(doc.namespaces.length == 4)
|
70
70
|
nsnode.namespaces.delete_all!
|
71
71
|
assert(doc.namespaces.length == 2)
|
72
|
-
end
|
73
|
-
end
|
72
|
+
end
|
73
|
+
end
|
data/xml-smart.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "xml-smart"
|
3
|
-
s.version = "0.4.
|
3
|
+
s.version = "0.4.4"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.license = "LGPL-3.0"
|
6
6
|
s.summary = "An xml library that doesn't suck - since 2004."
|
@@ -11,6 +11,8 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.require_path = 'lib'
|
12
12
|
s.extra_rdoc_files = ['README.rdoc']
|
13
13
|
s.test_files = Dir['test/tc_*.rb','test/*.xml','test/*.rng','test/*.xsd','test/smartrunner.rb','minitest/*']
|
14
|
+
s.bindir = 'example'
|
15
|
+
s.executables = ['xpath_visual']
|
14
16
|
|
15
17
|
s.authors = ['Juergen eTM Mangler']
|
16
18
|
s.email = 'juergen.mangler@gmail.com'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-smart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
8
|
-
autorequire:
|
9
|
-
bindir:
|
8
|
+
autorequire:
|
9
|
+
bindir: example
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -73,7 +73,8 @@ dependencies:
|
|
73
73
|
description: An xml library that doesn't suck (since 2004). Based on Nokogiri since
|
74
74
|
2012. For more info check out the Documentation link below.
|
75
75
|
email: juergen.mangler@gmail.com
|
76
|
-
executables:
|
76
|
+
executables:
|
77
|
+
- xpath_visual
|
77
78
|
extensions: []
|
78
79
|
extra_rdoc_files:
|
79
80
|
- README.rdoc
|
@@ -82,8 +83,9 @@ files:
|
|
82
83
|
- COPYING
|
83
84
|
- README.rdoc
|
84
85
|
- Rakefile
|
86
|
+
- example/CARD.xml
|
85
87
|
- example/EXAMPLE.xml
|
86
|
-
- example/xpath_visual
|
88
|
+
- example/xpath_visual
|
87
89
|
- lib/xml/XSDtoRNG.xsl
|
88
90
|
- lib/xml/smart.rb
|
89
91
|
- lib/xml/smart_dom.rb
|
@@ -147,7 +149,7 @@ homepage: http://www.wst.univie.ac.at/~mangler/xml-smart/
|
|
147
149
|
licenses:
|
148
150
|
- LGPL-3.0
|
149
151
|
metadata: {}
|
150
|
-
post_install_message:
|
152
|
+
post_install_message:
|
151
153
|
rdoc_options: []
|
152
154
|
require_paths:
|
153
155
|
- lib
|
@@ -162,53 +164,52 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
164
|
- !ruby/object:Gem::Version
|
163
165
|
version: '0'
|
164
166
|
requirements: []
|
165
|
-
|
166
|
-
|
167
|
-
signing_key:
|
167
|
+
rubygems_version: 3.2.22
|
168
|
+
signing_key:
|
168
169
|
specification_version: 4
|
169
170
|
summary: An xml library that doesn't suck - since 2004.
|
170
171
|
test_files:
|
171
|
-
- test/
|
172
|
+
- test/tc_add.rb
|
173
|
+
- test/tc_basic.rb
|
174
|
+
- test/tc_concurrent.rb
|
175
|
+
- test/tc_copy.rb
|
176
|
+
- test/tc_create.rb
|
172
177
|
- test/tc_delete.rb
|
173
|
-
- test/
|
174
|
-
- test/
|
175
|
-
- test/
|
178
|
+
- test/tc_move_elements.rb
|
179
|
+
- test/tc_namespace_default.rb
|
180
|
+
- test/tc_namespace_detailed.rb
|
176
181
|
- test/tc_namespace_find.rb
|
177
|
-
- test/tc_sort.rb
|
178
182
|
- test/tc_nested.rb
|
179
|
-
- test/
|
180
|
-
- test/
|
181
|
-
- test/
|
182
|
-
- test/
|
183
|
+
- test/tc_pi.rb
|
184
|
+
- test/tc_qname.rb
|
185
|
+
- test/tc_relaxng.rb
|
186
|
+
- test/tc_root.rb
|
183
187
|
- test/tc_set_or_replace.rb
|
188
|
+
- test/tc_sort.rb
|
184
189
|
- test/tc_string.rb
|
185
|
-
- test/
|
186
|
-
- test/
|
187
|
-
- test/
|
188
|
-
- test/
|
189
|
-
- test/
|
190
|
-
- test/tc_basic.rb
|
191
|
-
- test/tc_move_elements.rb
|
192
|
-
- test/tc_create.rb
|
190
|
+
- test/tc_todoc.rb
|
191
|
+
- test/tc_version.rb
|
192
|
+
- test/tc_write.rb
|
193
|
+
- test/tc_xinclude.rb
|
194
|
+
- test/tc_xmlschema.rb
|
193
195
|
- test/tc_xpath.rb
|
194
|
-
- test/
|
196
|
+
- test/tc_xpath_attrs.rb
|
195
197
|
- test/tc_xpath_functions.rb
|
196
|
-
- test/
|
197
|
-
- test/
|
198
|
-
- test/tc_todoc.rb
|
199
|
-
- test/HELLO.xml
|
200
|
-
- test/EXAMPLE-NS.xml
|
201
|
-
- test/3.xml
|
202
|
-
- test/XSL_BASE.xml
|
198
|
+
- test/tc_xpath_root.rb
|
199
|
+
- test/tc_xsl.rb
|
203
200
|
- test/1.xml
|
204
|
-
- test/EXAMPLE.str.xml
|
205
201
|
- test/2.xml
|
206
|
-
- test/
|
202
|
+
- test/3.xml
|
203
|
+
- test/EXAMPLE-NS.xml
|
207
204
|
- test/EXAMPLE-NSE.xml
|
208
|
-
- test/
|
205
|
+
- test/EXAMPLE.str.xml
|
206
|
+
- test/EXAMPLE.tmp.xml
|
207
|
+
- test/EXAMPLE.xml
|
209
208
|
- test/HELLO-MORE.xml
|
209
|
+
- test/HELLO.xml
|
210
|
+
- test/XSL_BASE.xml
|
210
211
|
- test/XSL_DOCUMENT.xml
|
211
|
-
- test/
|
212
|
+
- test/concurrent.xml
|
212
213
|
- test/HELLO.rng
|
213
214
|
- test/HELLO.xsd
|
214
215
|
- test/smartrunner.rb
|