xml-mapping 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +10 -53
  3. data/README.md +57 -0
  4. data/Rakefile +75 -85
  5. data/TODO.txt +12 -2
  6. data/examples/README +4 -4
  7. data/examples/cleanup.rb +11 -0
  8. data/examples/company_usage.intout +7 -7
  9. data/examples/documents_folders_usage.intout +2 -2
  10. data/examples/order_signature_enhanced_usage.intout +3 -3
  11. data/examples/order_usage.intout +26 -26
  12. data/examples/person.intout +3 -3
  13. data/examples/person_mm.intout +2 -2
  14. data/examples/publication.intout +2 -2
  15. data/examples/reader.intout +1 -1
  16. data/examples/stringarray_usage.intout +1 -1
  17. data/examples/time_augm.intout +6 -6
  18. data/examples/xpath_create_new.intout +13 -13
  19. data/examples/xpath_ensure_created.intout +2 -2
  20. data/examples/xpath_usage.intout +1 -1
  21. data/lib/xml/mapping.rb +0 -2
  22. data/lib/xml/mapping/base.rb +24 -9
  23. data/lib/xml/mapping/version.rb +1 -1
  24. data/test/company.rb +43 -0
  25. data/test/documents_folders.rb +7 -0
  26. data/test/multiple_mappings_test.rb +3 -1
  27. data/test/xml_mapping_adv_test.rb +20 -20
  28. data/test/xml_mapping_test.rb +31 -2
  29. data/{README → user_manual.md} +916 -154
  30. data/user_manual_xxpath.md +677 -0
  31. metadata +100 -112
  32. data/ChangeLog +0 -189
  33. data/README_XPATH +0 -202
  34. data/examples/company_usage.intin.rb +0 -19
  35. data/examples/documents_folders_usage.intin.rb +0 -18
  36. data/examples/order_signature_enhanced_usage.intin.rb +0 -12
  37. data/examples/order_usage.intin.rb +0 -120
  38. data/examples/person.intin.rb +0 -44
  39. data/examples/person_mm.intin.rb +0 -119
  40. data/examples/publication.intin.rb +0 -44
  41. data/examples/reader.intin.rb +0 -33
  42. data/examples/stringarray_usage.intin.rb +0 -11
  43. data/examples/time_augm.intin.rb +0 -19
  44. data/examples/time_augm_loading.intin.rb +0 -44
  45. data/examples/time_node.intin.rb +0 -79
  46. data/examples/time_node_w_marshallers.intin.rb +0 -48
  47. data/examples/xpath_create_new.intin.rb +0 -85
  48. data/examples/xpath_docvsroot.intin.rb +0 -30
  49. data/examples/xpath_ensure_created.intin.rb +0 -62
  50. data/examples/xpath_pathological.intin.rb +0 -42
  51. data/examples/xpath_usage.intin.rb +0 -51
  52. data/install.rb +0 -41
  53. data/test/xxpath_benchmark.result1.txt +0 -17
metadata CHANGED
@@ -1,148 +1,136 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: xml-mapping
3
- version: !ruby/object:Gem::Version
4
- version: 0.9.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.10.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Olaf Klischat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2010-05-21 00:00:00 +02:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description:
17
- email: olaf.klischat@sofd.de
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: An easy to use, extensible library for semi-automatically mapping Ruby
28
+ objects to XML and back. Includes an XPath interpreter.
29
+ email: olaf.klischat@gmail.com
18
30
  executables: []
19
-
20
31
  extensions: []
21
-
22
- extra_rdoc_files:
23
- - README
24
- - README_XPATH
25
- - ChangeLog
32
+ extra_rdoc_files:
33
+ - user_manual.md
34
+ - README.md
35
+ - user_manual_xxpath.md
26
36
  - TODO.txt
27
37
  - doc/xpath_impl_notes.txt
28
- files:
29
- - README
30
- - README_XPATH
31
- - ChangeLog
38
+ files:
39
+ - LICENSE
40
+ - README.md
41
+ - Rakefile
32
42
  - TODO.txt
33
43
  - doc/xpath_impl_notes.txt
34
- - lib/xml/xxpath.rb
35
- - lib/xml/xxpath_methods.rb
36
- - lib/xml/xxpath/steps.rb
37
- - lib/xml/mapping/standard_nodes.rb
38
- - lib/xml/mapping/core_classes_mapping.rb
39
- - lib/xml/mapping/version.rb
40
- - lib/xml/mapping/base.rb
41
- - lib/xml/rexml_ext.rb
42
- - lib/xml/mapping.rb
43
- - examples/xpath_create_new.intin.rb
44
- - examples/xpath_ensure_created.intout
45
- - examples/time_augm_loading.intout
46
- - examples/time_node_w_marshallers.intin.rb
47
- - examples/order.rb
48
44
  - examples/README
49
- - examples/time_augm.intin.rb
50
- - examples/stringarray_usage.intin.rb
51
- - examples/xpath_ensure_created.intin.rb
52
- - examples/time_augm.intout
53
- - examples/person_mm.intout
54
- - examples/person_mm.intin.rb
55
- - examples/order_signature_enhanced.rb
45
+ - examples/cleanup.rb
46
+ - examples/company.rb
56
47
  - examples/company.xml
57
- - examples/person.intout
58
- - examples/stringarray_usage.intout
48
+ - examples/company_usage.intout
49
+ - examples/documents_folders.rb
50
+ - examples/documents_folders.xml
59
51
  - examples/documents_folders_usage.intout
60
- - examples/time_node.rb
61
- - examples/person.intin.rb
62
- - examples/time_node_w_marshallers.xml
63
- - examples/reader.intin.rb
64
- - examples/company_usage.intin.rb
65
- - examples/xpath_pathological.intin.rb
66
- - examples/xpath_pathological.intout
52
+ - examples/order.rb
53
+ - examples/order.xml
54
+ - examples/order_signature_enhanced.rb
67
55
  - examples/order_signature_enhanced.xml
68
- - examples/time_augm_loading.intin.rb
69
- - examples/xpath_usage.intin.rb
70
- - examples/xpath_docvsroot.intin.rb
71
- - examples/stringarray.rb
72
- - examples/time_node.intin.rb
73
- - examples/publication.intin.rb
74
- - examples/documents_folders_usage.intin.rb
75
- - examples/xpath_usage.intout
76
- - examples/order_signature_enhanced_usage.intin.rb
77
- - examples/documents_folders.xml
78
- - examples/order_usage.intin.rb
79
- - examples/xpath_create_new.intout
80
- - examples/company.rb
81
56
  - examples/order_signature_enhanced_usage.intout
82
- - examples/order.xml
83
57
  - examples/order_usage.intout
58
+ - examples/person.intout
59
+ - examples/person_mm.intout
84
60
  - examples/publication.intout
85
- - examples/company_usage.intout
86
- - examples/time_node_w_marshallers.intout
87
61
  - examples/reader.intout
62
+ - examples/stringarray.rb
88
63
  - examples/stringarray.xml
64
+ - examples/stringarray_usage.intout
65
+ - examples/time_augm.intout
66
+ - examples/time_augm_loading.intout
67
+ - examples/time_node.rb
68
+ - examples/time_node_w_marshallers.intout
69
+ - examples/time_node_w_marshallers.xml
70
+ - examples/xpath_create_new.intout
89
71
  - examples/xpath_docvsroot.intout
90
- - examples/documents_folders.rb
91
- - test/xxpath_benchmark.rb
92
- - test/xxpath_methods_test.rb
72
+ - examples/xpath_ensure_created.intout
73
+ - examples/xpath_pathological.intout
74
+ - examples/xpath_usage.intout
75
+ - lib/xml/mapping.rb
76
+ - lib/xml/mapping/base.rb
77
+ - lib/xml/mapping/core_classes_mapping.rb
78
+ - lib/xml/mapping/standard_nodes.rb
79
+ - lib/xml/mapping/version.rb
80
+ - lib/xml/rexml_ext.rb
81
+ - lib/xml/xxpath.rb
82
+ - lib/xml/xxpath/steps.rb
83
+ - lib/xml/xxpath_methods.rb
84
+ - test/all_tests.rb
85
+ - test/benchmark_fixtures.rb
86
+ - test/bookmarks.rb
87
+ - test/company.rb
88
+ - test/documents_folders.rb
93
89
  - test/examples_test.rb
94
- - test/fixtures/triangle_m2.xml
95
- - test/fixtures/company1.xml
96
- - test/fixtures/bookmarks1.xml
97
90
  - test/fixtures/benchmark.xml
98
- - test/fixtures/triangle_m1.xml
99
- - test/fixtures/documents_folders2.xml
91
+ - test/fixtures/bookmarks1.xml
92
+ - test/fixtures/company1.xml
100
93
  - test/fixtures/documents_folders.xml
101
- - test/xml_mapping_test.rb
102
- - test/triangle_mm.rb
103
- - test/xpath_test.rb
104
- - test/xxpath_benchmark.result1.txt
105
- - test/tests_init.rb
106
- - test/rexml_xpath_benchmark.rb
107
- - test/all_tests.rb
108
- - test/multiple_mappings_test.rb
94
+ - test/fixtures/documents_folders2.xml
95
+ - test/fixtures/triangle_m1.xml
96
+ - test/fixtures/triangle_m2.xml
109
97
  - test/inheritance_test.rb
110
- - test/company.rb
98
+ - test/multiple_mappings_test.rb
99
+ - test/rexml_xpath_benchmark.rb
100
+ - test/tests_init.rb
101
+ - test/triangle_mm.rb
111
102
  - test/xml_mapping_adv_test.rb
112
- - test/bookmarks.rb
113
- - test/benchmark_fixtures.rb
114
- - test/documents_folders.rb
115
- - LICENSE
116
- - Rakefile
117
- - install.rb
118
- has_rdoc: true
119
- homepage: http://xml-mapping.rubyforge.org
120
- licenses: []
121
-
103
+ - test/xml_mapping_test.rb
104
+ - test/xpath_test.rb
105
+ - test/xxpath_benchmark.rb
106
+ - test/xxpath_methods_test.rb
107
+ - user_manual.md
108
+ - user_manual_xxpath.md
109
+ homepage: https://github.com/multi-io/xml-mapping
110
+ licenses:
111
+ - Apache-2.0
112
+ metadata: {}
122
113
  post_install_message:
123
- rdoc_options:
124
- - --include
114
+ rdoc_options:
115
+ - "--include"
125
116
  - examples
126
- require_paths:
117
+ require_paths:
127
118
  - lib
128
- required_ruby_version: !ruby/object:Gem::Requirement
129
- requirements:
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
130
121
  - - ">="
131
- - !ruby/object:Gem::Version
132
- version: "0"
133
- version:
134
- required_rubygems_version: !ruby/object:Gem::Requirement
135
- requirements:
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
136
126
  - - ">="
137
- - !ruby/object:Gem::Version
138
- version: "0"
139
- version:
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
140
129
  requirements: []
141
-
142
130
  rubyforge_project: xml-mapping
143
- rubygems_version: 1.3.5
131
+ rubygems_version: 2.2.2
144
132
  signing_key:
145
- specification_version: 3
146
- summary: An easy to use, extensible library for mapping Ruby objects to XML and back. Includes an XPath interpreter.
147
- test_files:
133
+ specification_version: 4
134
+ summary: XML-Object mapper for Ruby
135
+ test_files:
148
136
  - test/all_tests.rb
data/ChangeLog DELETED
@@ -1,189 +0,0 @@
1
- 2006/12/26 Olaf Klischat
2
-
3
- * when creating a new instance of a mapping class from an XML
4
- input, call new if possible rather than allocate (patch by Fred
5
- Loney)
6
-
7
- 2006/04/30 Olaf Klischat
8
-
9
- * xml/xxpath: text() steps
10
-
11
- 2006/03/31 Olaf Klischat
12
-
13
- * SubObjectBaseNode: store marshaller/unmarshaller in
14
- @marshaller/@unmarshaller (general policy for node
15
- implementations is to set @options to
16
- originally supplied option arguments and never change it; then
17
- store "extracted" information in additional @attributes)
18
-
19
- 2006/02/19 Olaf Klischat
20
-
21
- * xml/xxpath: child::*[@attrname='attrvalue'] steps
22
-
23
- 2006/02/19 Olaf Klischat
24
-
25
- * xml/xxpath: .[@attrname='attrvalue'] steps
26
-
27
- 2005/12/30 Olaf Klischat
28
-
29
- * node initializers in node's initialize() method; initialize_impl
30
- deprecated (but retained for backward compatibility)
31
-
32
- 2005/12/28 Olaf Klischat
33
-
34
- * :reader/:writer options to node factory functions (for partially
35
- or completely overriding the node's functionality)
36
-
37
- 2005/12/07 Olaf Klischat
38
-
39
- * ChangeLog file
40
-
41
- 2005/11/30 Olaf Klischat
42
-
43
- * bugfix: clone default values to avoid external modifications
44
-
45
- 2005/11/27 Olaf Klischat
46
-
47
- * xml/xxpath: name1|name2|... steps
48
-
49
- 2005/11/19 Olaf Klischat
50
-
51
- * support for String and numeric types in :class attributes
52
-
53
- 2005/11/16 Olaf Klischat
54
-
55
- * choice_node
56
-
57
- 2005/11/05 Olaf Klischat
58
-
59
- * xml/xxpath: descendants ("//") axis
60
-
61
- 2005/10/11 Olaf Klischat
62
-
63
- * support for "." paths/path elements (map sub-objects to XML data
64
- from the parent object's XML element)
65
-
66
- 2005/10/05 Olaf Klischat
67
-
68
- * multiple distinct mappings per mapping class
69
-
70
- 2005/09/30 Olaf Klischat
71
-
72
- * @options moved from SingleAttributeNode to Node
73
-
74
- 2005/07/07 Olaf Klischat
75
-
76
- * release 0.8
77
-
78
- 2005/07/04 Olaf Klischat
79
-
80
- * xml/xpath / XML::XPath -> xml/xxpath / XML::XXPath, license ->
81
- Ruby's
82
-
83
- 2005/06/29 Olaf Klischat
84
-
85
- * when creating elt[@attr='value'] path elements, add a new
86
- element if one with @attr='value' already existed
87
-
88
- 2005/03/30 Olaf Klischat
89
-
90
- * add_accessor: check for existing accessors.
91
-
92
- 2005/03/05 Olaf Klischat
93
-
94
- * better support for inheritance among mapping
95
- classes
96
-
97
- 2005/03/03 Olaf Klischat
98
-
99
- * "polymorphic" nodes via root element
100
- name. SubObjectBaseNode-based nodes es use node polymorphy when
101
- no explicit node marshaller/unmarshaller has been sp ecified.
102
-
103
- 2005/02/28 Olaf Klischat
104
-
105
- * mapping root elt name => mapping class;
106
- XML::Mapping::load_object_from_* implemented
107
-
108
- 2005/02/13 Olaf Klischat
109
-
110
- * IntNode renamed & generalized to NumericNode
111
-
112
- 2005/02/12 Olaf Klischat
113
-
114
- * renaming *_rexml => *_xml
115
-
116
- 2005/01/27 Olaf Klischat
117
-
118
- * special exception NoAttrValueSet for indicating absence of a
119
- specific attribute in an XML source
120
-
121
- 2005/01/23 Olaf Klischat
122
-
123
- * some more documentation, Node.obj_initializing, setting node
124
- values to defaults on initialization
125
-
126
- 2005/01/10 Olaf Klischat
127
-
128
- * root_element_name
129
-
130
- 2005/01/07 Olaf Klischat
131
-
132
- * refactoring:
133
-
134
- Made node types (classes) dynamically addable via
135
- XML::Mapping.add_node_class, xml/mapping.rb moved to
136
- xml/mapping/base.rb, node types moved to
137
- xml/mapping/standard_nodes.rb, xml/mapping.rb now requires base
138
- and standard_nodes and adds all standard node types to
139
- XML::Mapping.
140
-
141
- * additional node class SingleAttributeNode < Node for nodes that
142
- map to a single attribute in their class (that's true for all
143
- nodes we have so far). Call to add_attribute moved from "core"
144
- to SingleAttributeNode.initialize.
145
-
146
- * XML::Mapping: @nodes renamed to @xml_mapping_nodes to minimize
147
- chance of name clashes.
148
-
149
- 2004/12/30 Olaf Klischat
150
-
151
- * array node writing, hash node writing
152
-
153
-
154
- 2004/12/30 Olaf Klischat
155
-
156
- * xpath: create_new flag, + convenience method
157
-
158
- 2004/12/21 Olaf Klischat
159
-
160
- * node classes
161
-
162
- 2004/12/20 Olaf Klischat
163
-
164
- * hash_node
165
-
166
- 2004/12/08 Olaf Klischat
167
-
168
- * xpath: attribute nodes
169
-
170
- * xml_mapping: retargeted from REXML::XPath to XML::XPath
171
-
172
- 2004/12/02 Olaf Klischat
173
-
174
- * xpath: write accessors
175
-
176
- 2004/11/27 Olaf Klischat
177
-
178
- * xpath: read access seems to work
179
-
180
- 2004/11/25 Olaf Klischat
181
-
182
- * array_node
183
-
184
- stone age Olaf Klischat
185
-
186
- * see http://rubygarden.org/ruby?XmlMapping
187
-
188
-
189
-
@@ -1,202 +0,0 @@
1
- = XML-XXPATH
2
-
3
- == Overview, Motivation
4
-
5
- Xml-xxpath is an (incomplete) XPath interpreter that is at the moment
6
- bundled with xml-mapping. It is built on top of REXML. xml-mapping
7
- uses xml-xxpath extensively for implementing its node types -- see the
8
- README file and the reference documentation (and the source code) for
9
- details. xml-xxpath, however, does not depend on xml-mapping at all,
10
- and is useful in its own right -- maybe I'll later distribute it as a
11
- seperate library instead of bundling it. For the time being, if you
12
- want to use this XPath implementation stand-alone, you can just rip
13
- the files <tt>lib/xml/xxpath.rb</tt>,
14
- <tt>lib/xml/xxpath/steps.rb</tt>, and
15
- <tt>lib/xml/xxpath_methods.rb</tt> out of the xml-mapping distribution
16
- and use them on their own (they do not depend on anything else).
17
-
18
- xml-xxpath's XPath support is vastly incomplete (see below), but, in
19
- addition to the normal reading/matching functionality found in other
20
- XPath implementations (i.e. "find all elements in a given XML document
21
- matching a given XPath expression"), xml-xxpath supports <i>write
22
- access</i>. For example, when writing the XPath expression
23
- "/foo/bar[3]/baz[@key='hiho']" to the XML document
24
-
25
- <foo>
26
- <bar>
27
- <baz key='ab'>hello</baz>
28
- <baz key='xy'>goodbye</baz>
29
- </bar>
30
- </foo>
31
-
32
- , you'll get:
33
-
34
- <foo>
35
- <bar>
36
- <baz key='ab'>hello</baz>
37
- <baz key='xy'>goodbye</baz>
38
- </bar>
39
- <bar/>
40
- <bar><baz key='hiho'/></bar>
41
- </foo>
42
-
43
- This feature is used by xml-mapping when writing (marshalling) Ruby
44
- objects to XML, and is actually the reason why I couldn't just use any
45
- of the existing XPath implementations, e.g. the one that comes with
46
- REXML. Also, the whole xml-xxpath implementation is just 300 lines of
47
- Ruby code, it is quite fast (paths are precompiled), and xml-xxpath
48
- returns matched elements in the order they appeared in the source
49
- document -- I've heard REXML::XPath doesn't do that :)
50
-
51
- Some basic knowledge of XPath is helpful for reading this document.
52
-
53
- At the moment, xml-xxpath understands XPath expressions of the form
54
- [<tt>/</tt>]_pathelement_<tt>/[/]</tt>_pathelement_<tt>/[/]</tt>...,
55
- where each _pathelement_ must be one of these:
56
-
57
- - a simple element name _name_, e.g. +signature+
58
-
59
- - an attribute name, @_attr_name_, e.g. <tt>@key</tt>
60
-
61
- - a combination of an element name and an attribute name and
62
- -value, in the form _elt_name_[@_attr_name_='_attr_value_']
63
-
64
- - an element name and an index, _elt_name_[_index_]
65
-
66
- - the "match-all" path element, <tt>*</tt>
67
-
68
- - .
69
-
70
- - name1|name2|...
71
-
72
- - .[@key='xy'] / self::*[@key='xy']
73
-
74
- - child::*[@key='xy']
75
-
76
- - text()
77
-
78
-
79
-
80
- Xml-xxpath only supports relative paths at this time, i.e. XPath
81
- expressions beginning with "/" or "//" will still only find nodes
82
- below the node the expression is applied to (as if you had written
83
- "./" or ".//", respectively).
84
-
85
-
86
- == Usage
87
-
88
- Xml-xxpath defines the class XML::XXPath. An instance of that class
89
- wraps an XPath expression, the string representation of which must be
90
- supplied when constructing the instance. You then call instance
91
- methods like _first_, _all_ or <i>create_new</i> on the instance,
92
- supplying the REXML Element the XPath expression should be applied to,
93
- and get the results, or, in the case of write access, the element is
94
- updated in-place.
95
-
96
-
97
- === Read Access
98
-
99
- :include: xpath_usage.intout
100
-
101
- The objects supplied to the <tt>all()</tt>, <tt>first()</tt>, and
102
- <tt>each()</tt> calls must be REXML element nodes, i.e. they must
103
- support messages like <tt>elements</tt>, <tt>attributes</tt> etc
104
- (instances of REXML::Element and its subclasses do this). The calls
105
- return the found elements as instances of REXML::Element or
106
- XML::XXPath::Accessors::Attribute. The latter is a wrapper around
107
- attribute nodes that is largely call-compatible to
108
- REXML::Element. This is so you can write things like
109
- <tt>path.each{|node|puts node.text}</tt> without having to
110
- special-case anything even if the path matches attributes, not just
111
- elements.
112
-
113
- As you can see, you can re-use path objects, applying them to
114
- different XML elements at will. You should do this because the XPath
115
- pattern is stored inside the XPath object in a pre-compiled form,
116
- which makes it more efficient.
117
-
118
- The path elements of the XPath pattern are applied to the
119
- <tt>.elements</tt> collection of the passed XML element and its
120
- sub-elements, starting with the first one. This is shown by the
121
- following code:
122
-
123
- :include: xpath_docvsroot.intout
124
-
125
- A REXML +Document+ object is a REXML +Element+ object whose +elements+
126
- collection consists only of a single member -- the document's root
127
- node. The first path element of the XPath -- "foo" in the example --
128
- is matched against that. That is why the path "/bar" in the example
129
- doesn't match anything when matched against the document +d+ itself.
130
-
131
- An ordinary REXML +Element+ object that represents a node somewhere
132
- inside an XML tree has an +elements+ collection that consists of all
133
- the element's direct sub-elements. That is why XPath patterns matched
134
- against the +firstelt+ element in the example *must not* start with
135
- "/first" (unless there is a child node that is also named "first").
136
-
137
-
138
- === Write Access
139
-
140
- You may pass an <tt>:ensure_created=>true</tt> option argument to
141
- _path_.first(_elt_)/_path_.all(_elt_) calls to make sure that _path_
142
- exists inside the passed XML element _elt_. If it existed before,
143
- nothing changes, and the call behaves just as it would without the
144
- option argument. If the path didn't exist before, the XML element is
145
- modified such that
146
-
147
- - the path exists afterwards
148
-
149
- - all paths that existed before still exist afterwards
150
-
151
- - the modification is as small as possible (i.e. as few elements as
152
- possible are added, additional attributes are added to existing
153
- elements if possible etc.)
154
-
155
- The created resp. previously existing, matching elements are returned.
156
-
157
-
158
- Examples:
159
-
160
- :include: xpath_ensure_created.intout
161
-
162
-
163
- Alternatively, you may pass a <tt>:create_new=>true</tt> option
164
- argument or call <tt>create_new</tt> (_path_.create_new(_elt_) is
165
- equivalent to _path_.first(_elt_,:create_new=>true)). In that case, a
166
- new node is created in _elt_ for each path element of _path_ (or an
167
- exception raised if that wasn't possible for any path element).
168
-
169
- Examples:
170
-
171
- :include: xpath_create_new.intout
172
-
173
- This feature is used in xml-mapping by node types like
174
- XML::Mapping::ArrayNode, which must create a new instance of the
175
- "per-array element path" for each element of the array to be stored in
176
- an XML tree.
177
-
178
-
179
- === Pathological Cases
180
-
181
- What is created when the Path "*" is to be created inside an empty XML
182
- element? The name of the element to be created isn't known, but still
183
- some element must be created. The answer is that xml-xxpath creates a
184
- special "unspecified" element whose name must be set by the caller
185
- afterwards:
186
-
187
- :include: xpath_pathological.intout
188
-
189
- The "newelt" object in the last example is an ordinary
190
- REXML::Element. xml-xxpath mixes the "unspecified" attribute into that
191
- class, as well as into the XML::XXPath::Accessors::Attribute class
192
- mentioned above.
193
-
194
-
195
- == Implentation notes
196
-
197
- <tt>doc/xpath_impl_notes.txt</tt> contains some documentation on the
198
- implementation of xml-xxpath.
199
-
200
- == License
201
-
202
- Ruby's.