xml-mapping 0.8.1 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +64 -3
- data/README +871 -173
- data/README_XPATH +40 -13
- data/Rakefile +37 -26
- data/TODO.txt +39 -8
- data/examples/README +5 -0
- data/examples/company_usage.intout +34 -22
- data/examples/documents_folders.rb +31 -0
- data/examples/documents_folders.xml +16 -0
- data/examples/documents_folders_usage.intin.rb +18 -0
- data/examples/documents_folders_usage.intout +46 -0
- data/examples/order_signature_enhanced_usage.intout +21 -11
- data/examples/order_usage.intin.rb +52 -5
- data/examples/order_usage.intout +154 -80
- data/examples/person.intin.rb +44 -0
- data/examples/person.intout +27 -0
- data/examples/person_mm.intin.rb +119 -0
- data/examples/person_mm.intout +114 -0
- data/examples/publication.intin.rb +44 -0
- data/examples/publication.intout +20 -0
- data/examples/reader.intin.rb +33 -0
- data/examples/reader.intout +19 -0
- data/examples/stringarray.rb +5 -0
- data/examples/stringarray.xml +10 -0
- data/examples/stringarray_usage.intin.rb +11 -0
- data/examples/stringarray_usage.intout +31 -0
- data/examples/time_augm.intout +19 -7
- data/examples/time_augm_loading.intin.rb +44 -0
- data/examples/time_augm_loading.intout +12 -0
- data/examples/time_node.intin.rb +79 -0
- data/examples/time_node.rb +3 -2
- data/examples/time_node_w_marshallers.intin.rb +48 -0
- data/examples/time_node_w_marshallers.intout +25 -0
- data/examples/time_node_w_marshallers.xml +9 -0
- data/examples/xpath_create_new.intout +132 -114
- data/examples/xpath_ensure_created.intout +86 -65
- data/examples/xpath_pathological.intout +16 -16
- data/examples/xpath_usage.intout +1 -1
- data/install.rb +1 -0
- data/lib/xml/mapping.rb +3 -1
- data/lib/xml/mapping/base.rb +442 -272
- data/lib/xml/mapping/core_classes_mapping.rb +32 -0
- data/lib/xml/mapping/standard_nodes.rb +176 -86
- data/lib/xml/mapping/version.rb +2 -2
- data/lib/xml/rexml_ext.rb +186 -0
- data/lib/xml/xxpath.rb +28 -265
- data/lib/xml/xxpath/steps.rb +345 -0
- data/lib/xml/xxpath_methods.rb +96 -0
- data/test/all_tests.rb +4 -1
- data/test/benchmark_fixtures.rb +14 -0
- data/test/{multiple_mappings.rb → bookmarks.rb} +0 -0
- data/test/company.rb +47 -0
- data/test/documents_folders.rb +11 -1
- data/test/examples_test.rb +29 -0
- data/test/fixtures/benchmark.xml +77 -0
- data/test/fixtures/company1.xml +9 -0
- data/test/fixtures/documents_folders.xml +0 -8
- data/test/fixtures/documents_folders2.xml +13 -19
- data/test/fixtures/triangle_m1.xml +17 -0
- data/test/fixtures/triangle_m2.xml +19 -0
- data/test/inheritance_test.rb +50 -0
- data/test/multiple_mappings_test.rb +155 -0
- data/test/rexml_xpath_benchmark.rb +29 -0
- data/test/triangle_mm.rb +57 -0
- data/test/xml_mapping_adv_test.rb +36 -1
- data/test/xml_mapping_test.rb +136 -7
- data/test/xpath_test.rb +154 -0
- data/test/xxpath_benchmark.rb +36 -0
- data/test/xxpath_benchmark.result1.txt +17 -0
- data/test/xxpath_methods_test.rb +61 -0
- metadata +139 -90
data/examples/time_augm.intout
CHANGED
@@ -14,10 +14,22 @@ nowxml=Time.now.save_to_xml
|
|
14
14
|
=> <time> ... </>
|
15
15
|
nowxml.write($stdout,2)
|
16
16
|
<time>
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
<year>
|
18
|
+
2010
|
19
|
+
</year>
|
20
|
+
<month>
|
21
|
+
5
|
22
|
+
</month>
|
23
|
+
<mday>
|
24
|
+
21
|
25
|
+
</mday>
|
26
|
+
<hours>
|
27
|
+
16
|
28
|
+
</hours>
|
29
|
+
<minutes>
|
30
|
+
42
|
31
|
+
</minutes>
|
32
|
+
<seconds>
|
33
|
+
15
|
34
|
+
</seconds>
|
35
|
+
</time>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#:invisible:
|
2
|
+
$:.unshift "../lib"
|
3
|
+
require 'xml/mapping'
|
4
|
+
require 'xml/xxpath_methods'
|
5
|
+
|
6
|
+
class Time
|
7
|
+
include XML::Mapping
|
8
|
+
|
9
|
+
numeric_node :year, "year"
|
10
|
+
numeric_node :month, "month"
|
11
|
+
numeric_node :day, "mday"
|
12
|
+
numeric_node :hour, "hours"
|
13
|
+
numeric_node :min, "minutes"
|
14
|
+
numeric_node :sec, "seconds"
|
15
|
+
end
|
16
|
+
|
17
|
+
#<=
|
18
|
+
#:invisible_retval:
|
19
|
+
#:visible:
|
20
|
+
|
21
|
+
def Time.load_from_xml(xml, options={:mapping=>:_default})
|
22
|
+
year,month,day,hour,min,sec =
|
23
|
+
[xml.first_xpath("year").text.to_i,
|
24
|
+
xml.first_xpath("month").text.to_i,
|
25
|
+
xml.first_xpath("mday").text.to_i,
|
26
|
+
xml.first_xpath("hours").text.to_i,
|
27
|
+
xml.first_xpath("minutes").text.to_i,
|
28
|
+
xml.first_xpath("seconds").text.to_i]
|
29
|
+
Time.local(year,month,day,hour,min,sec)
|
30
|
+
end
|
31
|
+
#<=
|
32
|
+
#:invisible:
|
33
|
+
require 'test/unit/assertions'
|
34
|
+
include Test::Unit::Assertions
|
35
|
+
|
36
|
+
t = Time.now
|
37
|
+
t2 = Time.load_from_xml(t.save_to_xml)
|
38
|
+
|
39
|
+
assert_equal t.year, t2.year
|
40
|
+
assert_equal t.month, t2.month
|
41
|
+
assert_equal t.day, t2.day
|
42
|
+
assert_equal t.hour, t2.hour
|
43
|
+
assert_equal t.min, t2.min
|
44
|
+
assert_equal t.sec, t2.sec
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
def Time.load_from_xml(xml, options={:mapping=>:_default})
|
3
|
+
year,month,day,hour,min,sec =
|
4
|
+
[xml.first_xpath("year").text.to_i,
|
5
|
+
xml.first_xpath("month").text.to_i,
|
6
|
+
xml.first_xpath("mday").text.to_i,
|
7
|
+
xml.first_xpath("hours").text.to_i,
|
8
|
+
xml.first_xpath("minutes").text.to_i,
|
9
|
+
xml.first_xpath("seconds").text.to_i]
|
10
|
+
Time.local(year,month,day,hour,min,sec)
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#:invisible:
|
2
|
+
$:.unshift "../lib"
|
3
|
+
#<=
|
4
|
+
#:visible:
|
5
|
+
#:invisible_retval:
|
6
|
+
STDERR.puts "time_node top:\n#{$:.inspect}"
|
7
|
+
|
8
|
+
require 'xml/mapping/base'
|
9
|
+
|
10
|
+
STDERR.puts "time_node after require:\n#{$:.inspect}"
|
11
|
+
|
12
|
+
class TimeNode < XML::Mapping::SingleAttributeNode
|
13
|
+
def initialize(*args)
|
14
|
+
STDERR.puts "TimeNode#initialize top:\n#{$:.inspect}"
|
15
|
+
path,*args = super(*args)
|
16
|
+
@y_path = XML::XXPath.new(path+"/year")
|
17
|
+
@m_path = XML::XXPath.new(path+"/month")
|
18
|
+
@d_path = XML::XXPath.new(path+"/day")
|
19
|
+
args
|
20
|
+
end
|
21
|
+
|
22
|
+
def extract_attr_value(xml)
|
23
|
+
y,m,d = default_when_xpath_err{ [@y_path.first(xml).text.to_i,
|
24
|
+
@m_path.first(xml).text.to_i,
|
25
|
+
@d_path.first(xml).text.to_i]
|
26
|
+
}
|
27
|
+
Time.local(y,m,d)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_attr_value(xml, value)
|
31
|
+
@y_path.first(xml,:ensure_created=>true).text = value.year
|
32
|
+
@m_path.first(xml,:ensure_created=>true).text = value.month
|
33
|
+
@d_path.first(xml,:ensure_created=>true).text = value.day
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
XML::Mapping.add_node_class TimeNode
|
38
|
+
|
39
|
+
#<=
|
40
|
+
#:invisible:
|
41
|
+
require 'xml/mapping'
|
42
|
+
|
43
|
+
class Signature
|
44
|
+
include XML::Mapping
|
45
|
+
|
46
|
+
text_node :name, "Name"
|
47
|
+
text_node :position, "Position", :default_value=>"Some Employee"
|
48
|
+
time_node :signed_on, "signed-on", :default_value=>Time.now
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
require 'test/unit/assertions'
|
53
|
+
include Test::Unit::Assertions
|
54
|
+
|
55
|
+
xml = REXML::Document.new('
|
56
|
+
<Signature>
|
57
|
+
<Name>John Doe</Name>
|
58
|
+
<Position>product manager</Position>
|
59
|
+
<signed-on>
|
60
|
+
<day>13</day>
|
61
|
+
<month>2</month>
|
62
|
+
<year>2005</year>
|
63
|
+
</signed-on>
|
64
|
+
</Signature>
|
65
|
+
').root
|
66
|
+
|
67
|
+
|
68
|
+
s = Signature.load_from_xml xml
|
69
|
+
assert_equal Time.local(2005,2,13), s.signed_on
|
70
|
+
|
71
|
+
s.signed_on = Time.local(2006,6,15)
|
72
|
+
xml2 = s.save_to_xml
|
73
|
+
|
74
|
+
require 'xml/xxpath_methods'
|
75
|
+
assert_equal "15", xml2.first_xpath("signed-on/day").text
|
76
|
+
assert_equal "6", xml2.first_xpath("signed-on/month").text
|
77
|
+
assert_equal "2006", xml2.first_xpath("signed-on/year").text
|
78
|
+
|
79
|
+
#<=
|
data/examples/time_node.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'xml/mapping/base'
|
2
2
|
|
3
3
|
class TimeNode < XML::Mapping::SingleAttributeNode
|
4
|
-
def
|
4
|
+
def initialize(*args)
|
5
|
+
path,*args = super(*args)
|
5
6
|
@y_path = XML::XXPath.new(path+"/year")
|
6
7
|
@m_path = XML::XXPath.new(path+"/month")
|
7
8
|
@d_path = XML::XXPath.new(path+"/day")
|
9
|
+
args
|
8
10
|
end
|
9
11
|
|
10
12
|
def extract_attr_value(xml)
|
@@ -16,7 +18,6 @@ class TimeNode < XML::Mapping::SingleAttributeNode
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def set_attr_value(xml, value)
|
19
|
-
raise "Not a Time: #{value}" unless Time===value
|
20
21
|
@y_path.first(xml,:ensure_created=>true).text = value.year
|
21
22
|
@m_path.first(xml,:ensure_created=>true).text = value.month
|
22
23
|
@d_path.first(xml,:ensure_created=>true).text = value.day
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#:invisible:
|
2
|
+
#:invisible_retval:
|
3
|
+
$:.unshift "../lib" #<=
|
4
|
+
#:visible:
|
5
|
+
require 'xml/mapping'
|
6
|
+
require 'xml/xxpath_methods'
|
7
|
+
|
8
|
+
class Signature
|
9
|
+
include XML::Mapping
|
10
|
+
|
11
|
+
text_node :name, "Name"
|
12
|
+
text_node :position, "Position", :default_value=>"Some Employee"
|
13
|
+
object_node :signed_on, "signed-on",
|
14
|
+
:unmarshaller=>proc{|xml|
|
15
|
+
y,m,d = [xml.first_xpath("year").text.to_i,
|
16
|
+
xml.first_xpath("month").text.to_i,
|
17
|
+
xml.first_xpath("day").text.to_i]
|
18
|
+
Time.local(y,m,d)
|
19
|
+
},
|
20
|
+
:marshaller=>proc{|xml,value|
|
21
|
+
e = xml.elements.add; e.name = "year"; e.text = value.year
|
22
|
+
e = xml.elements.add; e.name = "month"; e.text = value.month
|
23
|
+
e = xml.elements.add; e.name = "day"; e.text = value.day
|
24
|
+
|
25
|
+
# xml.first("year",:ensure_created=>true).text = value.year
|
26
|
+
# xml.first("month",:ensure_created=>true).text = value.month
|
27
|
+
# xml.first("day",:ensure_created=>true).text = value.day
|
28
|
+
}
|
29
|
+
end #<=
|
30
|
+
#:invisible:
|
31
|
+
require 'test/unit/assertions'
|
32
|
+
|
33
|
+
include Test::Unit::Assertions
|
34
|
+
|
35
|
+
t=Time.local(2005,12,1)
|
36
|
+
|
37
|
+
s=Signature.new
|
38
|
+
s.name = "Olaf Klischat"; s.position="chief"; s.signed_on=t
|
39
|
+
xml = s.save_to_xml
|
40
|
+
|
41
|
+
assert_equal "2005", xml.first_xpath("signed-on/year").text
|
42
|
+
assert_equal "12", xml.first_xpath("signed-on/month").text
|
43
|
+
assert_equal "1", xml.first_xpath("signed-on/day").text
|
44
|
+
|
45
|
+
s2 = Signature.load_from_xml xml
|
46
|
+
assert_equal "Olaf Klischat", s2.name
|
47
|
+
assert_equal "chief", s2.position
|
48
|
+
assert_equal t, s2.signed_on
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'xml/mapping'
|
2
|
+
require 'xml/xxpath_methods'
|
3
|
+
|
4
|
+
class Signature
|
5
|
+
include XML::Mapping
|
6
|
+
|
7
|
+
text_node :name, "Name"
|
8
|
+
text_node :position, "Position", :default_value=>"Some Employee"
|
9
|
+
object_node :signed_on, "signed-on",
|
10
|
+
:unmarshaller=>proc{|xml|
|
11
|
+
y,m,d = [xml.first_xpath("year").text.to_i,
|
12
|
+
xml.first_xpath("month").text.to_i,
|
13
|
+
xml.first_xpath("day").text.to_i]
|
14
|
+
Time.local(y,m,d)
|
15
|
+
},
|
16
|
+
:marshaller=>proc{|xml,value|
|
17
|
+
e = xml.elements.add; e.name = "year"; e.text = value.year
|
18
|
+
e = xml.elements.add; e.name = "month"; e.text = value.month
|
19
|
+
e = xml.elements.add; e.name = "day"; e.text = value.day
|
20
|
+
|
21
|
+
# xml.first("year",:ensure_created=>true).text = value.year
|
22
|
+
# xml.first("month",:ensure_created=>true).text = value.month
|
23
|
+
# xml.first("day",:ensure_created=>true).text = value.day
|
24
|
+
}
|
25
|
+
end
|
@@ -17,17 +17,20 @@ path1=XML::XXPath.new("/bar/baz[@key='work']")
|
|
17
17
|
path1.create_new(rootelt)
|
18
18
|
=> <baz key='work'/>
|
19
19
|
d.write($stdout,2)
|
20
|
-
|
21
|
-
|
22
|
-
<baz key='work'>Java</baz>
|
23
|
-
<baz key='play'>Ruby</baz>
|
24
|
-
</bar>
|
20
|
+
|
21
|
+
<foo>
|
25
22
|
<bar>
|
26
|
-
|
27
|
-
|
28
|
-
</
|
29
|
-
|
30
|
-
|
23
|
+
<baz key='work'>
|
24
|
+
Java
|
25
|
+
</baz>
|
26
|
+
<baz key='play'>
|
27
|
+
Ruby
|
28
|
+
</baz>
|
29
|
+
</bar>
|
30
|
+
<bar>
|
31
|
+
<baz key='work'/>
|
32
|
+
</bar>
|
33
|
+
</foo>### a new element is created for *each* path element, regardless of
|
31
34
|
### what existed before. So a new "bar" element was added, with a new
|
32
35
|
### "baz" element inside it
|
33
36
|
|
@@ -35,20 +38,23 @@ d.write($stdout,2)
|
|
35
38
|
path1.create_new(rootelt)
|
36
39
|
=> <baz key='work'/>
|
37
40
|
d.write($stdout,2)
|
38
|
-
|
39
|
-
|
40
|
-
<baz key='work'>Java</baz>
|
41
|
-
<baz key='play'>Ruby</baz>
|
42
|
-
</bar>
|
41
|
+
|
42
|
+
<foo>
|
43
43
|
<bar>
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
</
|
50
|
-
|
51
|
-
|
44
|
+
<baz key='work'>
|
45
|
+
Java
|
46
|
+
</baz>
|
47
|
+
<baz key='play'>
|
48
|
+
Ruby
|
49
|
+
</baz>
|
50
|
+
</bar>
|
51
|
+
<bar>
|
52
|
+
<baz key='work'/>
|
53
|
+
</bar>
|
54
|
+
<bar>
|
55
|
+
<baz key='work'/>
|
56
|
+
</bar>
|
57
|
+
</foo>### same procedure -- new elements added for each path element
|
52
58
|
|
53
59
|
|
54
60
|
## get reference to 1st "baz" element
|
@@ -58,89 +64,98 @@ firstbazelt=XML::XXPath.new("/bar/baz").first(rootelt)
|
|
58
64
|
path2=XML::XXPath.new("@key2")
|
59
65
|
|
60
66
|
path2.create_new(firstbazelt)
|
61
|
-
=> #<XML::XXPath::Accessors::Attribute:
|
67
|
+
=> #<XML::XXPath::Accessors::Attribute:0x7f48764e8688 @name="key2", @parent=<baz key='work' key2='[unset]'> ... </>>
|
62
68
|
d.write($stdout,2)
|
63
|
-
|
64
|
-
|
65
|
-
<baz key2='[unset]' key='work'>Java</baz>
|
66
|
-
<baz key='play'>Ruby</baz>
|
67
|
-
</bar>
|
69
|
+
|
70
|
+
<foo>
|
68
71
|
<bar>
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
</
|
75
|
-
|
76
|
-
|
72
|
+
<baz key='work' key2='[unset]'>
|
73
|
+
Java
|
74
|
+
</baz>
|
75
|
+
<baz key='play'>
|
76
|
+
Ruby
|
77
|
+
</baz>
|
78
|
+
</bar>
|
79
|
+
<bar>
|
80
|
+
<baz key='work'/>
|
81
|
+
</bar>
|
82
|
+
<bar>
|
83
|
+
<baz key='work'/>
|
84
|
+
</bar>
|
85
|
+
</foo>### ok, new attribute node added
|
77
86
|
|
78
87
|
### same call again...
|
79
88
|
path2.create_new(firstbazelt)
|
80
|
-
XML::XXPathError: XPath (
|
81
|
-
from ../lib/xml/../xml/xxpath.rb:
|
82
|
-
from ../lib/xml/../xml/xxpath.rb:
|
83
|
-
from ../lib/xml
|
84
|
-
from ../lib/xml
|
85
|
-
from ../lib/xml
|
86
|
-
from ../lib/xml
|
89
|
+
XML::XXPathError: XPath (@key2): create_new and attribute already exists
|
90
|
+
from ../lib/xml/../xml/xxpath/steps.rb:215:in `create_on'
|
91
|
+
from ../lib/xml/../xml/xxpath/steps.rb:80:in `creator'
|
92
|
+
from ../lib/xml/xxpath.rb:91:in `call'
|
93
|
+
from ../lib/xml/xxpath.rb:91:in `all'
|
94
|
+
from ../lib/xml/xxpath.rb:70:in `first'
|
95
|
+
from ../lib/xml/xxpath.rb:112:in `create_new'
|
87
96
|
### can't create that path anew again -- an element can't have more
|
88
97
|
### than one attribute with the same name
|
89
98
|
|
90
99
|
### the document hasn't changed
|
91
100
|
d.write($stdout,2)
|
92
|
-
|
93
|
-
|
94
|
-
<baz key2='[unset]' key='work'>Java</baz>
|
95
|
-
<baz key='play'>Ruby</baz>
|
96
|
-
</bar>
|
101
|
+
|
102
|
+
<foo>
|
97
103
|
<bar>
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
</
|
104
|
-
|
105
|
-
|
104
|
+
<baz key='work' key2='[unset]'>
|
105
|
+
Java
|
106
|
+
</baz>
|
107
|
+
<baz key='play'>
|
108
|
+
Ruby
|
109
|
+
</baz>
|
110
|
+
</bar>
|
111
|
+
<bar>
|
112
|
+
<baz key='work'/>
|
113
|
+
</bar>
|
114
|
+
<bar>
|
115
|
+
<baz key='work'/>
|
116
|
+
</bar>
|
117
|
+
</foo>
|
106
118
|
|
107
119
|
|
108
120
|
### create_new the same path as in the ensure_created example
|
109
121
|
baz6elt=XML::XXPath.new("/bar/baz[6]").create_new(rootelt)
|
110
122
|
=> <baz/>
|
111
123
|
d.write($stdout,2)
|
112
|
-
|
113
|
-
|
114
|
-
<baz key2='[unset]' key='work'>Java</baz>
|
115
|
-
<baz key='play'>Ruby</baz>
|
116
|
-
</bar>
|
124
|
+
|
125
|
+
<foo>
|
117
126
|
<bar>
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
127
|
+
<baz key='work' key2='[unset]'>
|
128
|
+
Java
|
129
|
+
</baz>
|
130
|
+
<baz key='play'>
|
131
|
+
Ruby
|
132
|
+
</baz>
|
133
|
+
</bar>
|
134
|
+
<bar>
|
135
|
+
<baz key='work'/>
|
136
|
+
</bar>
|
137
|
+
<bar>
|
138
|
+
<baz key='work'/>
|
139
|
+
</bar>
|
140
|
+
<bar>
|
141
|
+
<baz/>
|
142
|
+
<baz/>
|
143
|
+
<baz/>
|
144
|
+
<baz/>
|
145
|
+
<baz/>
|
146
|
+
<baz/>
|
147
|
+
</bar>
|
148
|
+
</foo>### ok, new "bar" element and 6th "baz" element inside it created
|
134
149
|
|
135
150
|
|
136
151
|
XML::XXPath.new("baz[6]").create_new(baz6elt.parent)
|
137
|
-
XML::XXPathError: XPath
|
138
|
-
from ../lib/xml/../xml/xxpath.rb:
|
139
|
-
from ../lib/xml/../xml/xxpath.rb:
|
140
|
-
from ../lib/xml
|
141
|
-
from ../lib/xml
|
142
|
-
from ../lib/xml
|
143
|
-
from ../lib/xml
|
152
|
+
XML::XXPathError: XPath: baz[6]: create_new and element already exists
|
153
|
+
from ../lib/xml/../xml/xxpath/steps.rb:167:in `create_on'
|
154
|
+
from ../lib/xml/../xml/xxpath/steps.rb:80:in `creator'
|
155
|
+
from ../lib/xml/xxpath.rb:91:in `call'
|
156
|
+
from ../lib/xml/xxpath.rb:91:in `all'
|
157
|
+
from ../lib/xml/xxpath.rb:70:in `first'
|
158
|
+
from ../lib/xml/xxpath.rb:112:in `create_new'
|
144
159
|
### yep, baz[6] already existed and thus couldn't be created once
|
145
160
|
### again
|
146
161
|
|
@@ -148,34 +163,37 @@ XML::XXPathError: XPath (): baz[6]: create_new and element already exists
|
|
148
163
|
XML::XXPath.new("/bar/baz[6]").create_new(rootelt)
|
149
164
|
=> <baz/>
|
150
165
|
d.write($stdout,2)
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
166
|
+
|
167
|
+
<foo>
|
168
|
+
<bar>
|
169
|
+
<baz key='work' key2='[unset]'>
|
170
|
+
Java
|
171
|
+
</baz>
|
172
|
+
<baz key='play'>
|
173
|
+
Ruby
|
174
|
+
</baz>
|
175
|
+
</bar>
|
176
|
+
<bar>
|
177
|
+
<baz key='work'/>
|
178
|
+
</bar>
|
179
|
+
<bar>
|
180
|
+
<baz key='work'/>
|
181
|
+
</bar>
|
182
|
+
<bar>
|
183
|
+
<baz/>
|
184
|
+
<baz/>
|
185
|
+
<baz/>
|
186
|
+
<baz/>
|
187
|
+
<baz/>
|
188
|
+
<baz/>
|
189
|
+
</bar>
|
156
190
|
<bar>
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
<baz/>
|
166
|
-
<baz/>
|
167
|
-
<baz/>
|
168
|
-
<baz/>
|
169
|
-
</bar>
|
170
|
-
<bar>
|
171
|
-
<baz/>
|
172
|
-
<baz/>
|
173
|
-
<baz/>
|
174
|
-
<baz/>
|
175
|
-
<baz/>
|
176
|
-
<baz/>
|
177
|
-
</bar>
|
178
|
-
</foo>
|
179
|
-
|
180
|
-
### this works because *all* path elements are newly created
|
191
|
+
<baz/>
|
192
|
+
<baz/>
|
193
|
+
<baz/>
|
194
|
+
<baz/>
|
195
|
+
<baz/>
|
196
|
+
<baz/>
|
197
|
+
</bar>
|
198
|
+
</foo>### this works because *all* path elements are newly created
|
181
199
|
|