xml-mapping 0.8.1 → 0.9.1
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/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
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
root = XML::Mapping.load_object_from_file "documents_folders.xml"
|
3
|
+
=> #<Folder:0x7f48766041e8 @name="home", @entries=[#<Document:0x7f4876600f70 @name="plan", @contents=" inhale, exhale">, #<Folder:0x7f48765febf8 @name="work", @entries=[#<Folder:0x7f48765fc1a0 @name="xml-mapping", @entries=[#<Document:0x7f48765fa6c0 @name="README", @contents="foo bar baz">]>]>]>
|
4
|
+
root.name
|
5
|
+
=> "home"
|
6
|
+
root.entries
|
7
|
+
=> [#<Document:0x7f4876600f70 @name="plan", @contents=" inhale, exhale">, #<Folder:0x7f48765febf8 @name="work", @entries=[#<Folder:0x7f48765fc1a0 @name="xml-mapping", @entries=[#<Document:0x7f48765fa6c0 @name="README", @contents="foo bar baz">]>]>]
|
8
|
+
|
9
|
+
root.append "etc", Folder.new
|
10
|
+
root["etc"].append "passwd", Document.new
|
11
|
+
root["etc"]["passwd"].contents = "foo:x:2:2:/bin/sh"
|
12
|
+
root["etc"].append "hosts", Document.new
|
13
|
+
root["etc"]["hosts"].contents = "127.0.0.1 localhost"
|
14
|
+
|
15
|
+
xml = root.save_to_xml
|
16
|
+
=> <folder name='home'> ... </>
|
17
|
+
xml.write $stdout,2
|
18
|
+
|
19
|
+
<folder name='home'>
|
20
|
+
<document name='plan'>
|
21
|
+
<contents>
|
22
|
+
inhale, exhale
|
23
|
+
</contents>
|
24
|
+
</document>
|
25
|
+
<folder name='work'>
|
26
|
+
<folder name='xml-mapping'>
|
27
|
+
<document name='README'>
|
28
|
+
<contents>
|
29
|
+
foo bar baz
|
30
|
+
</contents>
|
31
|
+
</document>
|
32
|
+
</folder>
|
33
|
+
</folder>
|
34
|
+
<folder name='etc'>
|
35
|
+
<document name='passwd'>
|
36
|
+
<contents>
|
37
|
+
foo:x:2:2:/bin/sh
|
38
|
+
</contents>
|
39
|
+
</document>
|
40
|
+
<document name='hosts'>
|
41
|
+
<contents>
|
42
|
+
127.0.0.1 localhost
|
43
|
+
</contents>
|
44
|
+
</document>
|
45
|
+
</folder>
|
46
|
+
</folder>
|
@@ -1,16 +1,26 @@
|
|
1
1
|
s=Signature.load_from_file("order_signature_enhanced.xml")
|
2
|
-
=> #<Signature:
|
2
|
+
=> #<Signature:0x7f487642e850 @signed_on=Sun Feb 13 00:00:00 +0100 2005, @name="John Doe", @position="product manager">
|
3
3
|
s.signed_on
|
4
|
-
=> Sun Feb 13 00:00:00
|
4
|
+
=> Sun Feb 13 00:00:00 +0100 2005
|
5
5
|
s.signed_on=Time.local(1976,12,18)
|
6
|
-
=> Sat Dec 18 00:00:00
|
6
|
+
=> Sat Dec 18 00:00:00 +0100 1976
|
7
7
|
s.save_to_xml.write($stdout,2)
|
8
8
|
<signature>
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
<Name>
|
10
|
+
John Doe
|
11
|
+
</Name>
|
12
|
+
<Position>
|
13
|
+
product manager
|
14
|
+
</Position>
|
15
|
+
<signed-on>
|
16
|
+
<year>
|
17
|
+
1976
|
18
|
+
</year>
|
19
|
+
<month>
|
20
|
+
12
|
21
|
+
</month>
|
22
|
+
<day>
|
23
|
+
18
|
24
|
+
</day>
|
25
|
+
</signed-on>
|
26
|
+
</signature>=> #<File:examples/order_signature_enhanced_usage.intout>
|
@@ -4,7 +4,12 @@ begin
|
|
4
4
|
Object.send(:remove_const, "Address") # name clash with company_usage...
|
5
5
|
rescue
|
6
6
|
end
|
7
|
-
require 'order'
|
7
|
+
require 'order'
|
8
|
+
|
9
|
+
require 'xml/xxpath_methods'
|
10
|
+
|
11
|
+
require 'test/unit/assertions'
|
12
|
+
include Test::Unit::Assertions #<=
|
8
13
|
#:visible:
|
9
14
|
####read access
|
10
15
|
o=Order.load_from_file("order.xml") #<=
|
@@ -20,6 +25,17 @@ o.signatures[2].position #<=
|
|
20
25
|
|
21
26
|
o.total_price #<=
|
22
27
|
|
28
|
+
#:invisible:
|
29
|
+
assert_equal "12343-AHSHE-314159", o.reference
|
30
|
+
assert_equal "Jean Smith", o.client.name
|
31
|
+
assert_equal "San Francisco", o.client.work_address.city
|
32
|
+
assert_equal "San Mateo", o.client.home_address.city
|
33
|
+
assert_equal %w{RF-0001 RF-0034 RF-3341}, o.items.keys.sort
|
34
|
+
assert_equal ['John Doe','Jill Smith','Miles O\'Brien'], o.signatures.map{|s|s.name}
|
35
|
+
assert_equal 2575, (10 * o.total_price).round
|
36
|
+
#<=
|
37
|
+
#:visible:
|
38
|
+
|
23
39
|
####write access
|
24
40
|
o.client.name="James T. Kirk"
|
25
41
|
o.items['RF-4711'] = Item.new
|
@@ -34,8 +50,17 @@ o.signatures << s
|
|
34
50
|
xml=o.save_to_xml #convert to REXML node; there's also o.save_to_file(name) #<=
|
35
51
|
#:invisible_retval:
|
36
52
|
xml.write($stdout,2) #<=
|
37
|
-
#:visible_retval:
|
38
53
|
|
54
|
+
#:invisible:
|
55
|
+
assert_equal %w{RF-0001 RF-0034 RF-3341 RF-4711}, xml.all_xpath("Item/@reference").map{|x|x.text}.sort
|
56
|
+
assert_equal ['John Doe','Jill Smith','Miles O\'Brien','Harry Smith'],
|
57
|
+
xml.all_xpath("Signed-By/Signature/Name").map{|x|x.text}
|
58
|
+
#<=
|
59
|
+
#:visible:
|
60
|
+
|
61
|
+
|
62
|
+
#<=
|
63
|
+
#:visible_retval:
|
39
64
|
####Starting a new order from scratch
|
40
65
|
o = Order.new #<=
|
41
66
|
## attributes with default values (here: signatures) are set
|
@@ -63,11 +88,33 @@ o.items['XY-42'].quantity = 3
|
|
63
88
|
o.items['XY-42'].unit_price = 299.95
|
64
89
|
|
65
90
|
#:invisible_retval:
|
66
|
-
o.save_to_xml
|
91
|
+
xml=o.save_to_xml
|
92
|
+
xml.write($stdout,2)
|
67
93
|
#<=
|
68
|
-
#:
|
94
|
+
#:invisible:
|
95
|
+
assert_equal "order", xml.name
|
96
|
+
assert_equal o.reference, xml.first_xpath("@reference").text
|
97
|
+
assert_equal o.client.name, xml.first_xpath("Client/Name").text
|
98
|
+
assert_equal o.client.home_address.street, xml.first_xpath("Client/Address[@where='home']/Street").text
|
99
|
+
assert_equal o.client.home_address.city, xml.first_xpath("Client/Address[@where='home']/City").text
|
100
|
+
assert_nil xml.first_xpath("Client/Address[@where='work']", :allow_nil=>true)
|
101
|
+
assert_equal 1, xml.all_xpath("Client/Address").size
|
102
|
+
|
103
|
+
o.client.work_address = Address.new
|
104
|
+
o.client.work_address.street = 'milky way 2'
|
105
|
+
o.client.work_address.city = 'Ursa Major'
|
106
|
+
o.client.work_address.zip = 18293
|
107
|
+
o.client.work_address.state = 'Magellan Cloud'
|
108
|
+
xml=o.save_to_xml
|
109
|
+
|
110
|
+
assert_equal o.client.work_address.street, xml.first_xpath("Client/Address[@where='work']/Street").text
|
111
|
+
assert_equal o.client.work_address.city, xml.first_xpath("Client/Address[@where='work']/City").text
|
112
|
+
assert_equal o.client.home_address.street, xml.first_xpath("Client/Address[@where='home']/Street").text
|
113
|
+
assert_equal 2, xml.all_xpath("Client/Address").size
|
114
|
+
#<=
|
115
|
+
#:visible:
|
69
116
|
|
70
117
|
## the root element name when saving an object to XML will by default
|
71
118
|
## be derived from the class name (in this example, "Order" became
|
72
119
|
## "order"). This can be overridden on a per-class basis; see
|
73
|
-
## XML::Mapping::ClassMethods#
|
120
|
+
## XML::Mapping::ClassMethods#root_element_name for details.
|
data/examples/order_usage.intout
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
####read access
|
2
2
|
o=Order.load_from_file("order.xml")
|
3
|
-
=> #<Order:
|
3
|
+
=> #<Order:0x7f4877650510 @reference="12343-AHSHE-314159", @signatures=[#<Signature:0x7f48776282b8 @name="John Doe", @position="product manager">, #<Signature:0x7f4877626d28 @name="Jill Smith", @position="clerk">, #<Signature:0x7f4877625798 @name="Miles O'Brien", @position="Some Employee">], @items={"RF-3341"=>#<Item:0x7f487762d290 @quantity=30, @descr="Cookie", @unit_price=0.85>, "RF-0034"=>#<Item:0x7f4877632808 @quantity=5, @descr="Chocolate", @unit_price=28.5>, "RF-0001"=>#<Item:0x7f487763a558 @quantity=10, @descr="Stuffed Penguin", @unit_price=8.95>}, @client=#<Client:0x7f487764d9c8 @name="Jean Smith", @work_address=#<Address:0x7f4877641588 @zip=94102, @street="98765, Fulton Street", @city="San Francisco", @state="CA">, @home_address=#<Address:0x7f4877645d40 @zip=94403, @street="2000, Alameda de las Pulgas", @city="San Mateo", @state="CA">>>
|
4
4
|
o.reference
|
5
5
|
=> "12343-AHSHE-314159"
|
6
6
|
o.client
|
7
|
-
=> #<Client:
|
7
|
+
=> #<Client:0x7f487764d9c8 @name="Jean Smith", @work_address=#<Address:0x7f4877641588 @zip=94102, @street="98765, Fulton Street", @city="San Francisco", @state="CA">, @home_address=#<Address:0x7f4877645d40 @zip=94403, @street="2000, Alameda de las Pulgas", @city="San Mateo", @state="CA">>
|
8
8
|
o.items.keys
|
9
9
|
=> ["RF-3341", "RF-0034", "RF-0001"]
|
10
10
|
o.items["RF-0034"].descr
|
@@ -12,7 +12,7 @@ o.items["RF-0034"].descr
|
|
12
12
|
o.items["RF-0034"].total_price
|
13
13
|
=> 142.5
|
14
14
|
o.signatures
|
15
|
-
=> [#<Signature:
|
15
|
+
=> [#<Signature:0x7f48776282b8 @name="John Doe", @position="product manager">, #<Signature:0x7f4877626d28 @name="Jill Smith", @position="clerk">, #<Signature:0x7f4877625798 @name="Miles O'Brien", @position="Some Employee">]
|
16
16
|
o.signatures[2].name
|
17
17
|
=> "Miles O'Brien"
|
18
18
|
o.signatures[2].position
|
@@ -37,72 +37,130 @@ xml=o.save_to_xml #convert to REXML node; there's also o.save_to_file(name)
|
|
37
37
|
=> <order reference='12343-AHSHE-314159'> ... </>
|
38
38
|
xml.write($stdout,2)
|
39
39
|
<order reference='12343-AHSHE-314159'>
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
</
|
65
|
-
<
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
40
|
+
<Client>
|
41
|
+
<Name>
|
42
|
+
James T. Kirk
|
43
|
+
</Name>
|
44
|
+
<Address where='home'>
|
45
|
+
<City>
|
46
|
+
San Mateo
|
47
|
+
</City>
|
48
|
+
<State>
|
49
|
+
CA
|
50
|
+
</State>
|
51
|
+
<ZIP>
|
52
|
+
94403
|
53
|
+
</ZIP>
|
54
|
+
<Street>
|
55
|
+
2000, Alameda de las Pulgas
|
56
|
+
</Street>
|
57
|
+
</Address>
|
58
|
+
<Address where='work'>
|
59
|
+
<City>
|
60
|
+
San Francisco
|
61
|
+
</City>
|
62
|
+
<State>
|
63
|
+
CA
|
64
|
+
</State>
|
65
|
+
<ZIP>
|
66
|
+
94102
|
67
|
+
</ZIP>
|
68
|
+
<Street>
|
69
|
+
98765, Fulton Street
|
70
|
+
</Street>
|
71
|
+
</Address>
|
72
|
+
</Client>
|
73
|
+
<Item reference='RF-3341'>
|
74
|
+
<Description>
|
75
|
+
Cookie
|
76
|
+
</Description>
|
77
|
+
<Quantity>
|
78
|
+
30
|
79
|
+
</Quantity>
|
80
|
+
<UnitPrice>
|
81
|
+
0.85
|
82
|
+
</UnitPrice>
|
83
|
+
</Item>
|
84
|
+
<Item reference='RF-4711'>
|
85
|
+
<Description>
|
86
|
+
power transfer grid
|
87
|
+
</Description>
|
88
|
+
<Quantity>
|
89
|
+
2
|
90
|
+
</Quantity>
|
91
|
+
<UnitPrice>
|
92
|
+
29.95
|
93
|
+
</UnitPrice>
|
94
|
+
</Item>
|
95
|
+
<Item reference='RF-0034'>
|
96
|
+
<Description>
|
97
|
+
Chocolate
|
98
|
+
</Description>
|
99
|
+
<Quantity>
|
100
|
+
5
|
101
|
+
</Quantity>
|
102
|
+
<UnitPrice>
|
103
|
+
28.5
|
104
|
+
</UnitPrice>
|
105
|
+
</Item>
|
106
|
+
<Item reference='RF-0001'>
|
107
|
+
<Description>
|
108
|
+
Stuffed Penguin
|
109
|
+
</Description>
|
110
|
+
<Quantity>
|
111
|
+
10
|
112
|
+
</Quantity>
|
113
|
+
<UnitPrice>
|
114
|
+
8.95
|
115
|
+
</UnitPrice>
|
116
|
+
</Item>
|
117
|
+
<Signed-By>
|
118
|
+
<Signature>
|
119
|
+
<Name>
|
120
|
+
John Doe
|
121
|
+
</Name>
|
122
|
+
<Position>
|
123
|
+
product manager
|
124
|
+
</Position>
|
125
|
+
</Signature>
|
126
|
+
<Signature>
|
127
|
+
<Name>
|
128
|
+
Jill Smith
|
129
|
+
</Name>
|
130
|
+
<Position>
|
131
|
+
clerk
|
132
|
+
</Position>
|
133
|
+
</Signature>
|
134
|
+
<Signature>
|
135
|
+
<Name>
|
136
|
+
Miles O'Brien
|
137
|
+
</Name>
|
138
|
+
</Signature>
|
139
|
+
<Signature>
|
140
|
+
<Name>
|
141
|
+
Harry Smith
|
142
|
+
</Name>
|
143
|
+
<Position>
|
144
|
+
general manager
|
145
|
+
</Position>
|
146
|
+
</Signature>
|
147
|
+
</Signed-By>
|
148
|
+
</order>
|
149
|
+
|
150
|
+
|
93
151
|
####Starting a new order from scratch
|
94
152
|
o = Order.new
|
95
|
-
=> #<Order:
|
153
|
+
=> #<Order:0x7f48766fc118 @signatures=[]>
|
96
154
|
## attributes with default values (here: signatures) are set
|
97
155
|
## automatically
|
98
156
|
|
99
157
|
xml=o.save_to_xml
|
100
158
|
XML::MappingError: no value, and no default value, for attribute: reference
|
101
|
-
from ../lib/xml/../xml/mapping/base.rb:
|
102
|
-
from ../lib/xml/../xml/mapping/base.rb:
|
103
|
-
from ../lib/xml/../xml/mapping/base.rb:
|
104
|
-
from ../lib/xml/../xml/mapping/base.rb:
|
105
|
-
from ../lib/xml/../xml/mapping/base.rb:
|
159
|
+
from ../lib/xml/../xml/mapping/base.rb:697:in `obj_to_xml'
|
160
|
+
from ../lib/xml/../xml/mapping/base.rb:218:in `fill_into_xml'
|
161
|
+
from ../lib/xml/../xml/mapping/base.rb:217:in `each'
|
162
|
+
from ../lib/xml/../xml/mapping/base.rb:217:in `fill_into_xml'
|
163
|
+
from ../lib/xml/../xml/mapping/base.rb:229:in `save_to_xml'
|
106
164
|
## can't save as long as there are still unset attributes without
|
107
165
|
## default values
|
108
166
|
|
@@ -121,27 +179,43 @@ o.items['XY-42'].descr = 'improbability drive'
|
|
121
179
|
o.items['XY-42'].quantity = 3
|
122
180
|
o.items['XY-42'].unit_price = 299.95
|
123
181
|
|
124
|
-
o.save_to_xml
|
182
|
+
xml=o.save_to_xml
|
183
|
+
xml.write($stdout,2)
|
125
184
|
|
126
185
|
<order reference='FOOBAR-1234'>
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
</
|
141
|
-
|
186
|
+
<Client>
|
187
|
+
<Name>
|
188
|
+
Ford Prefect
|
189
|
+
</Name>
|
190
|
+
<Address where='home'>
|
191
|
+
<City>
|
192
|
+
small planet
|
193
|
+
</City>
|
194
|
+
<State>
|
195
|
+
Betelgeuse system
|
196
|
+
</State>
|
197
|
+
<ZIP>
|
198
|
+
17263
|
199
|
+
</ZIP>
|
200
|
+
<Street>
|
201
|
+
42 Park Av.
|
202
|
+
</Street>
|
203
|
+
</Address>
|
204
|
+
</Client>
|
205
|
+
<Item reference='XY-42'>
|
206
|
+
<Description>
|
207
|
+
improbability drive
|
208
|
+
</Description>
|
209
|
+
<Quantity>
|
210
|
+
3
|
211
|
+
</Quantity>
|
212
|
+
<UnitPrice>
|
213
|
+
299.95
|
214
|
+
</UnitPrice>
|
215
|
+
</Item>
|
216
|
+
</order>
|
142
217
|
## the root element name when saving an object to XML will by default
|
143
218
|
## be derived from the class name (in this example, "Order" became
|
144
219
|
## "order"). This can be overridden on a per-class basis; see
|
145
|
-
## XML::Mapping::ClassMethods#
|
220
|
+
## XML::Mapping::ClassMethods#root_element_name for details.
|
146
221
|
|
147
|
-
=> nil
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#:invisible:
|
2
|
+
$:.unshift "../lib"
|
3
|
+
require 'xml/mapping'
|
4
|
+
require 'xml/xxpath_methods'
|
5
|
+
#<=
|
6
|
+
#:visible:
|
7
|
+
|
8
|
+
class Person
|
9
|
+
include XML::Mapping
|
10
|
+
|
11
|
+
choice_node :if, 'name', :then, (text_node :name, 'name'),
|
12
|
+
:elsif, '@name', :then, (text_node :name, '@name'),
|
13
|
+
:else, (text_node :name, '.')
|
14
|
+
end
|
15
|
+
|
16
|
+
### usage
|
17
|
+
|
18
|
+
p1 = Person.load_from_xml(REXML::Document.new('<person name="Jim"/>').root)#<=
|
19
|
+
|
20
|
+
p2 = Person.load_from_xml(REXML::Document.new('<person><name>James</name></person>').root)#<=
|
21
|
+
|
22
|
+
p3 = Person.load_from_xml(REXML::Document.new('<person>Suzy</person>').root)#<=
|
23
|
+
|
24
|
+
|
25
|
+
#:invisible_retval:
|
26
|
+
p1.save_to_xml.write($stdout)#<=
|
27
|
+
|
28
|
+
p2.save_to_xml.write($stdout)#<=
|
29
|
+
|
30
|
+
p3.save_to_xml.write($stdout)#<=
|
31
|
+
|
32
|
+
#:invisible:
|
33
|
+
require 'test/unit/assertions'
|
34
|
+
include Test::Unit::Assertions
|
35
|
+
|
36
|
+
assert_equal "Jim", p1.name
|
37
|
+
assert_equal "James", p2.name
|
38
|
+
assert_equal "Suzy", p3.name
|
39
|
+
|
40
|
+
xml = p3.save_to_xml
|
41
|
+
assert_equal "name", xml.elements[1].name
|
42
|
+
assert_equal "Suzy", xml.elements[1].text
|
43
|
+
|
44
|
+
#<=
|