jordi-xml_struct 0.2.1 → 0.9.0
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/README.rdoc +152 -0
- data/WHATSNEW +10 -0
- data/lib/xml_struct/adapters/hpricot.rb +47 -0
- data/lib/xml_struct/adapters/rexml.rb +34 -0
- data/lib/xml_struct/array_notation.rb +44 -0
- data/lib/xml_struct/blankish_slate.rb +1 -1
- data/lib/xml_struct/collection_proxy.rb +7 -3
- data/lib/xml_struct/default_adapter.rb +15 -0
- data/lib/xml_struct/method_missing_dispatchers.rb +43 -0
- data/lib/xml_struct/string.rb +6 -2
- data/lib/xml_struct.rb +31 -52
- data/xml_struct.gemspec +38 -0
- metadata +17 -49
- data/README.markdown +0 -151
- data/Rakefile +0 -36
- data/lib/xml_struct/common_behaviours.rb +0 -53
- data/test/samples/lorem.xml +0 -63
- data/test/samples/recipe.xml +0 -16
- data/test/samples/weird_characters.xml +0 -2
- data/test/test_helper.rb +0 -39
- data/test/vendor/test-spec/README +0 -378
- data/test/vendor/test-spec/ROADMAP +0 -1
- data/test/vendor/test-spec/Rakefile +0 -146
- data/test/vendor/test-spec/SPECS +0 -161
- data/test/vendor/test-spec/TODO +0 -2
- data/test/vendor/test-spec/bin/specrb +0 -107
- data/test/vendor/test-spec/examples/stack.rb +0 -38
- data/test/vendor/test-spec/examples/stack_spec.rb +0 -119
- data/test/vendor/test-spec/lib/test/spec/dox.rb +0 -148
- data/test/vendor/test-spec/lib/test/spec/rdox.rb +0 -25
- data/test/vendor/test-spec/lib/test/spec/should-output.rb +0 -49
- data/test/vendor/test-spec/lib/test/spec/version.rb +0 -8
- data/test/vendor/test-spec/lib/test/spec.rb +0 -660
- data/test/vendor/test-spec/test/spec_dox.rb +0 -39
- data/test/vendor/test-spec/test/spec_flexmock.rb +0 -209
- data/test/vendor/test-spec/test/spec_mocha.rb +0 -104
- data/test/vendor/test-spec/test/spec_nestedcontexts.rb +0 -26
- data/test/vendor/test-spec/test/spec_new_style.rb +0 -80
- data/test/vendor/test-spec/test/spec_should-output.rb +0 -26
- data/test/vendor/test-spec/test/spec_testspec.rb +0 -699
- data/test/vendor/test-spec/test/spec_testspec_order.rb +0 -26
- data/test/vendor/test-spec/test/test_testunit.rb +0 -22
- data/test/xml_struct_test.rb +0 -185
data/xml_struct.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'xml_struct'
|
3
|
+
s.version = '0.9.0'
|
4
|
+
s.date = '2008-10-13'
|
5
|
+
|
6
|
+
s.author = 'Jordi Bunster'
|
7
|
+
s.email = 'jordi@bunster.org'
|
8
|
+
s.homepage = 'http://github.com/jordi/xml_struct'
|
9
|
+
|
10
|
+
s.add_dependency 'activesupport'
|
11
|
+
|
12
|
+
s.summary = "The Rubyista's way to do quick XML sit-ups"
|
13
|
+
s.description = %{ This is a library for reading (not writing) XML. It is
|
14
|
+
particularly suited for cases where one is dealing with
|
15
|
+
small documents of a known structure.
|
16
|
+
|
17
|
+
It is slow and not devoid of caveats, but has a very
|
18
|
+
pleasant, Ruby-like syntax. }.strip!.gsub! /\s+/, ' '
|
19
|
+
|
20
|
+
s.files = %w[ MIT-LICENSE
|
21
|
+
README.rdoc
|
22
|
+
TODO
|
23
|
+
WHATSNEW
|
24
|
+
lib
|
25
|
+
lib/jordi-xml_struct.rb
|
26
|
+
lib/xml_struct
|
27
|
+
lib/xml_struct/adapters
|
28
|
+
lib/xml_struct/adapters/hpricot.rb
|
29
|
+
lib/xml_struct/adapters/rexml.rb
|
30
|
+
lib/xml_struct/array_notation.rb
|
31
|
+
lib/xml_struct/blankish_slate.rb
|
32
|
+
lib/xml_struct/collection_proxy.rb
|
33
|
+
lib/xml_struct/default_adapter.rb
|
34
|
+
lib/xml_struct/method_missing_dispatchers.rb
|
35
|
+
lib/xml_struct/string.rb
|
36
|
+
lib/xml_struct.rb
|
37
|
+
xml_struct.gemspec ]
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jordi-xml_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordi Bunster
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: "0"
|
23
23
|
version:
|
24
24
|
description: This is a library for reading (not writing) XML. It is particularly suited for cases where one is dealing with small documents of a known structure. It is slow and not devoid of caveats, but has a very pleasant, Ruby-like syntax.
|
25
25
|
email: jordi@bunster.org
|
@@ -27,28 +27,32 @@ executables: []
|
|
27
27
|
|
28
28
|
extensions: []
|
29
29
|
|
30
|
-
extra_rdoc_files:
|
31
|
-
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
32
|
files:
|
33
33
|
- MIT-LICENSE
|
34
|
-
- README.
|
35
|
-
- Rakefile
|
34
|
+
- README.rdoc
|
36
35
|
- TODO
|
37
36
|
- WHATSNEW
|
38
37
|
- lib
|
39
38
|
- lib/jordi-xml_struct.rb
|
40
39
|
- lib/xml_struct
|
40
|
+
- lib/xml_struct/adapters
|
41
|
+
- lib/xml_struct/adapters/hpricot.rb
|
42
|
+
- lib/xml_struct/adapters/rexml.rb
|
43
|
+
- lib/xml_struct/array_notation.rb
|
41
44
|
- lib/xml_struct/blankish_slate.rb
|
42
45
|
- lib/xml_struct/collection_proxy.rb
|
43
|
-
- lib/xml_struct/
|
46
|
+
- lib/xml_struct/default_adapter.rb
|
47
|
+
- lib/xml_struct/method_missing_dispatchers.rb
|
44
48
|
- lib/xml_struct/string.rb
|
45
49
|
- lib/xml_struct.rb
|
46
|
-
|
50
|
+
- xml_struct.gemspec
|
51
|
+
has_rdoc: false
|
47
52
|
homepage: http://github.com/jordi/xml_struct
|
48
53
|
post_install_message:
|
49
|
-
rdoc_options:
|
50
|
-
|
51
|
-
- README.markdown
|
54
|
+
rdoc_options: []
|
55
|
+
|
52
56
|
require_paths:
|
53
57
|
- lib
|
54
58
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -70,41 +74,5 @@ rubygems_version: 1.2.0
|
|
70
74
|
signing_key:
|
71
75
|
specification_version: 2
|
72
76
|
summary: The Rubyista's way to do quick XML sit-ups
|
73
|
-
test_files:
|
74
|
-
|
75
|
-
- test/samples
|
76
|
-
- test/samples/lorem.xml
|
77
|
-
- test/samples/recipe.xml
|
78
|
-
- test/samples/weird_characters.xml
|
79
|
-
- test/test_helper.rb
|
80
|
-
- test/vendor
|
81
|
-
- test/vendor/test-spec
|
82
|
-
- test/vendor/test-spec/bin
|
83
|
-
- test/vendor/test-spec/bin/specrb
|
84
|
-
- test/vendor/test-spec/examples
|
85
|
-
- test/vendor/test-spec/examples/stack.rb
|
86
|
-
- test/vendor/test-spec/examples/stack_spec.rb
|
87
|
-
- test/vendor/test-spec/lib
|
88
|
-
- test/vendor/test-spec/lib/test
|
89
|
-
- test/vendor/test-spec/lib/test/spec
|
90
|
-
- test/vendor/test-spec/lib/test/spec/dox.rb
|
91
|
-
- test/vendor/test-spec/lib/test/spec/rdox.rb
|
92
|
-
- test/vendor/test-spec/lib/test/spec/should-output.rb
|
93
|
-
- test/vendor/test-spec/lib/test/spec/version.rb
|
94
|
-
- test/vendor/test-spec/lib/test/spec.rb
|
95
|
-
- test/vendor/test-spec/Rakefile
|
96
|
-
- test/vendor/test-spec/README
|
97
|
-
- test/vendor/test-spec/ROADMAP
|
98
|
-
- test/vendor/test-spec/SPECS
|
99
|
-
- test/vendor/test-spec/test
|
100
|
-
- test/vendor/test-spec/test/spec_dox.rb
|
101
|
-
- test/vendor/test-spec/test/spec_flexmock.rb
|
102
|
-
- test/vendor/test-spec/test/spec_mocha.rb
|
103
|
-
- test/vendor/test-spec/test/spec_nestedcontexts.rb
|
104
|
-
- test/vendor/test-spec/test/spec_new_style.rb
|
105
|
-
- test/vendor/test-spec/test/spec_should-output.rb
|
106
|
-
- test/vendor/test-spec/test/spec_testspec.rb
|
107
|
-
- test/vendor/test-spec/test/spec_testspec_order.rb
|
108
|
-
- test/vendor/test-spec/test/test_testunit.rb
|
109
|
-
- test/vendor/test-spec/TODO
|
110
|
-
- test/xml_struct_test.rb
|
77
|
+
test_files: []
|
78
|
+
|
data/README.markdown
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
# XML Struct
|
2
|
-
|
3
|
-
(This is inspired by Python's `xml_objectify`)
|
4
|
-
|
5
|
-
XML Struct attempts to make accessing small, well-formed XML structures
|
6
|
-
convenient, by using dot notation (`foo.bar`) to represent both attributes
|
7
|
-
and child elements whenever possible.
|
8
|
-
|
9
|
-
XML parsing libraries (in general) have interfaces that are useful when
|
10
|
-
one is using XML for its intended purpose, but cumbersome when one always
|
11
|
-
sends the same XML structure, and always process all of it in the same
|
12
|
-
way. This one aims to be a bit different.
|
13
|
-
|
14
|
-
## Example usage
|
15
|
-
|
16
|
-
<recipe name="bread" prep_time="5 mins" cook_time="3 hours">
|
17
|
-
<title>Basic bread</title>
|
18
|
-
<ingredient amount="8" unit="dL">Flour</ingredient>
|
19
|
-
<ingredient amount="10" unit="grams">Yeast</ingredient>
|
20
|
-
<ingredient amount="4" unit="dL" state="warm">Water</ingredient>
|
21
|
-
<ingredient amount="1" unit="teaspoon">Salt</ingredient>
|
22
|
-
<instructions easy="yes" hard="false">
|
23
|
-
<step>Mix all ingredients together.</step>
|
24
|
-
<step>Knead thoroughly.</step>
|
25
|
-
<step>Cover with a cloth, and leave for one hour in warm room.</step>
|
26
|
-
<step>Knead again.</step>
|
27
|
-
<step>Place in a bread baking tin.</step>
|
28
|
-
<step>Cover with a cloth, and leave for one hour in warm room.</step>
|
29
|
-
<step>Bake in the oven at 180(degrees)C for 30 minutes.</step>
|
30
|
-
</instructions>
|
31
|
-
</recipe>
|
32
|
-
|
33
|
-
require 'xml_struct'
|
34
|
-
recipe = XMLStruct.new io_with_recipe_xml_shown_above
|
35
|
-
|
36
|
-
recipe.name => "bread"
|
37
|
-
recipe.title => "Basic bread"
|
38
|
-
|
39
|
-
recipe.ingredients.is_a?(Array) => true
|
40
|
-
recipe.ingredients.first.amount => "8" # Not a Fixnum. Too hard. :(
|
41
|
-
|
42
|
-
recipe.instructions.easy? => true
|
43
|
-
|
44
|
-
recipe.instructions.first.upcase => "MIX ALL INGREDIENTS TOGETHER."
|
45
|
-
recipe.instructions.steps.size => 7
|
46
|
-
|
47
|
-
## Installation instructions
|
48
|
-
|
49
|
-
sudo gem install jordi-xml_struct --source http://gems.github.com
|
50
|
-
|
51
|
-
## Motivation
|
52
|
-
|
53
|
-
XML is an **extensible** markup language. It is extensible because it is
|
54
|
-
meant to define markup languages for **any** type of document, so new tags
|
55
|
-
are needed depending on the problem domain.
|
56
|
-
|
57
|
-
Sometimes, however, XML ends up being used to solve a much simpler problem:
|
58
|
-
the issue of passing a data-structure over the network, and/or between two
|
59
|
-
different languages. Tools like JSON or YAML are a much better fit for
|
60
|
-
this kind of job, but one doesn't always have that luxury.
|
61
|
-
|
62
|
-
## Caveats
|
63
|
-
|
64
|
-
The dot notation is used as follows. For the given file:
|
65
|
-
|
66
|
-
<outer id="root" name="foo">
|
67
|
-
<name>Outer Element</name>
|
68
|
-
</outer>
|
69
|
-
|
70
|
-
`outer.name` is the `<name>` element. Child elements are always looked up
|
71
|
-
first, then attributes. To access the attribute in the case of ambiguity,
|
72
|
-
use `outer[:attr => 'name']`.
|
73
|
-
|
74
|
-
`outer.id` is really `Object#id`, because all of the object methods are
|
75
|
-
preserved (this is on purpose). To access the attribute `id`, use
|
76
|
-
`outer[:attr => 'id']`, or `outer['id']` since there's no element/attribute
|
77
|
-
ambiguity.
|
78
|
-
|
79
|
-
## Features & Problems
|
80
|
-
|
81
|
-
### Collection auto-folding
|
82
|
-
|
83
|
-
Similar to XML::Simple, XML Struct folds same named elements at the same
|
84
|
-
level. For example:
|
85
|
-
|
86
|
-
<student>
|
87
|
-
<name>Bob</name>
|
88
|
-
<course>Math</course>
|
89
|
-
<course>Biology</course>
|
90
|
-
</student>
|
91
|
-
|
92
|
-
student = XMLStruct.new(xml_file)
|
93
|
-
|
94
|
-
student.course.is_a? Array => true
|
95
|
-
student.course.first == 'Math' => true
|
96
|
-
student.course.last == 'Biology => true
|
97
|
-
|
98
|
-
### Collection pluralization:
|
99
|
-
|
100
|
-
With the same file from the `Collection auto-folding` section above, you
|
101
|
-
also get this (courtesy of `ActiveSupport`'s `Inflector`):
|
102
|
-
|
103
|
-
student.courses.first == student.course.first => true
|
104
|
-
|
105
|
-
### Collection proxy
|
106
|
-
|
107
|
-
Sometimes, collections are expressed with a container element in XML:
|
108
|
-
|
109
|
-
<student>
|
110
|
-
<name>Bob</name>
|
111
|
-
<courses>
|
112
|
-
<course>Math</course>
|
113
|
-
<course>Biology</course>
|
114
|
-
</courses>
|
115
|
-
</student>
|
116
|
-
|
117
|
-
In this case, since the container element `courses` has no text element
|
118
|
-
of its own, and it only has elements of one name under it, it delegates
|
119
|
-
all methods it doesn't contain to the collection below, so you get:
|
120
|
-
|
121
|
-
student.courses.collect { |c| c.downcase.to_sym } => [:math, :biology]
|
122
|
-
|
123
|
-
### Question mark notation
|
124
|
-
|
125
|
-
Strings that look like booleans are "booleanized" if called by their
|
126
|
-
question mark names (such as `enabled?`)
|
127
|
-
|
128
|
-
### Slow
|
129
|
-
|
130
|
-
So far, XML Struct uses REXML to do the actual XML parsing. Support
|
131
|
-
for using faster parsers is planned, leaving REXML as a fallback option.
|
132
|
-
|
133
|
-
### Recursive
|
134
|
-
|
135
|
-
The entire XML file is parsed using REXML right now, and then converted to
|
136
|
-
an XMLStruct of XMLStruct objects recursively. Deep files are bound to
|
137
|
-
throw `SystemStackError`, but for the kinds of files I need to read, things
|
138
|
-
are working fine so far. In any case, stream parsing is on the TODO list.
|
139
|
-
|
140
|
-
### Incomplete
|
141
|
-
|
142
|
-
It most likely doesn't work with a ton of features of complex XML files. I
|
143
|
-
will always try to accomodate those, as long as they don't make the basic
|
144
|
-
usage more complex. As usual, patches welcome.
|
145
|
-
|
146
|
-
## Legal
|
147
|
-
|
148
|
-
Copyright (c) 2008 Jordi Bunster, released under the MIT license
|
149
|
-
|
150
|
-
|
151
|
-
|
data/Rakefile
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
desc 'Default: run unit tests.'
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
desc 'Run the unit tests.'
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << 'lib'
|
11
|
-
t.pattern = 'test/**/*_test.rb'
|
12
|
-
t.verbose = true
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Generate documentation'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'XMLStruct'
|
19
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include 'README.markdown'
|
21
|
-
rdoc.rdoc_files.include 'lib/**/*.rb'
|
22
|
-
end
|
23
|
-
|
24
|
-
desc 'Measures test coverage using rcov'
|
25
|
-
task :rcov do
|
26
|
-
rm_f 'coverage'
|
27
|
-
rm_f 'coverage.data'
|
28
|
-
|
29
|
-
rcov = %{ rcov --aggregate coverage.data --text-summary
|
30
|
-
--include lib
|
31
|
-
--exclude /Library/Ruby
|
32
|
-
}.strip!.gsub! /\s+/, ' '
|
33
|
-
|
34
|
-
system("#{rcov} --html #{Dir.glob('test/**/*_test.rb').join(' ')}")
|
35
|
-
system('open coverage/index.html') if PLATFORM['darwin']
|
36
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module XMLStruct::CommonBehaviours
|
2
|
-
|
3
|
-
# Detect an existing method being called in question form:
|
4
|
-
def __question_answer(method, *args, &block)
|
5
|
-
if method.to_s.match(/\?$/) && args.empty? && block.nil?
|
6
|
-
boolish = __send__(method.to_s.chomp('?').to_sym).to_s
|
7
|
-
|
8
|
-
return true if %w[ true yes t y ].include? boolish.downcase
|
9
|
-
return false if %w[ false no f n ].include? boolish.downcase
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# Array-notation access to elements and attributes. It comes handy when
|
14
|
-
# the element or attribute you need to reach is not reachable via dot
|
15
|
-
# notation (because it's not a valid method name, or because the method
|
16
|
-
# exists, such as 'id' or 'class').
|
17
|
-
#
|
18
|
-
# It also supports hash keys, which are useful to reach attributes named
|
19
|
-
# the same as elements in the same level (which otherwise go first)
|
20
|
-
#
|
21
|
-
# All of this is a lot easier to exampling by example:
|
22
|
-
#
|
23
|
-
# <article id="main_article" author="j-random">
|
24
|
-
# <author>J. Random Hacker</author>
|
25
|
-
# </article>
|
26
|
-
#
|
27
|
-
# article.id => 9314390 # Object#id gets called
|
28
|
-
# article[:id] => "main_article" # id attribute
|
29
|
-
# article[:author] => <XMLStruct ...> # <author> element
|
30
|
-
# article[:attr => 'author'] => "j-random" # author attribute
|
31
|
-
#
|
32
|
-
# Valid keys for the hash notation in the example above are :attr,
|
33
|
-
# :attribute, :child, and :element.
|
34
|
-
def [](name)
|
35
|
-
return @__target[name] if @__target && name.is_a?(Numeric)
|
36
|
-
|
37
|
-
unless name.is_a? Hash
|
38
|
-
return @__children[name.to_sym] if @__children[name.to_sym]
|
39
|
-
return @__attributes[name.to_sym] if @__attributes[name.to_sym]
|
40
|
-
end
|
41
|
-
|
42
|
-
raise 'one and only one key allowed' if name.size != 1
|
43
|
-
|
44
|
-
case (param = name.keys.first.to_sym)
|
45
|
-
when :element : @__children[name.values.first.to_sym]
|
46
|
-
when :child : @__children[name.values.first.to_sym]
|
47
|
-
when :attr : @__attributes[name.values.first.to_sym]
|
48
|
-
when :attribute : @__attributes[name.values.first.to_sym]
|
49
|
-
else raise %{ Invalid key :#{param.to_s}.
|
50
|
-
Use one of :element, :child, :attr, or :attribute }.squish!
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/test/samples/lorem.xml
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
<!-- Invalid method name test -->
|
2
|
-
<lorem id="root" name="ipsum dolor sit amet" _tempor="incididunt">
|
3
|
-
|
4
|
-
<_minim>veniam</_minim> <!-- Invalid method name test -->
|
5
|
-
|
6
|
-
<!-- unambiguous element/attribute access test -->
|
7
|
-
<sed do="eiusmod attributus">
|
8
|
-
<do price="$8">eiusmod elementus</do>
|
9
|
-
</sed>
|
10
|
-
|
11
|
-
<!-- Blank test -->
|
12
|
-
<ipsum></ipsum>
|
13
|
-
<dolor foo="bar"></dolor>
|
14
|
-
<sit><amet></amet></sit>
|
15
|
-
<ut>quis</ut>
|
16
|
-
|
17
|
-
<!-- To test the array folding feature, as well as the pluralization.
|
18
|
-
The attributes help test float, integer, and boolean recognition,
|
19
|
-
as well as method name clashing behaviour (id) -->
|
20
|
-
<consectetur id="1" capacity="2.13" enabled="yes" />
|
21
|
-
<consectetur id="2" capacity="-1.9" enabled="No" />
|
22
|
-
<consectetur id="3" capacity="13.0" enabled="True" />
|
23
|
-
<consectetur id="4" capacity="0.00" enabled="false" />
|
24
|
-
|
25
|
-
<!-- Test boolean recognition -->
|
26
|
-
<brutus>true</brutus>
|
27
|
-
|
28
|
-
<consecteturs> <!-- To test that we can still reach this, even though
|
29
|
-
the array of singular ones above will trap the call
|
30
|
-
to this when using dot notation -->
|
31
|
-
<culpa>officia</culpa>
|
32
|
-
</consecteturs>
|
33
|
-
|
34
|
-
<cupidatats> <!-- Test for the empty element == single array child
|
35
|
-
scenario, as well as date recognition -->
|
36
|
-
<cupidatat activated_at="2903-02-12">Aliqua</cupidatat>
|
37
|
-
<cupidatat activated_at="2903-02-13">Occaecat</cupidatat>
|
38
|
-
<cupidatat activated_at="2904-10-18">Cupidatat</cupidatat>
|
39
|
-
<cupidatat activated_at="2905-03-21">Mollit</cupidatat>
|
40
|
-
</cupidatats>
|
41
|
-
|
42
|
-
<!-- Non-empty element, should not be array proxy -->
|
43
|
-
<voluptate>
|
44
|
-
velit
|
45
|
-
<esse>cillum</esse>
|
46
|
-
<esse>cillum dolore</esse>
|
47
|
-
</voluptate>
|
48
|
-
|
49
|
-
<!-- Test for both text value and CDATA value -->
|
50
|
-
<ullamco>Laboris<![CDATA[nisi]]></ullamco>
|
51
|
-
|
52
|
-
<!-- Test for multiple CDATA values -->
|
53
|
-
<deserunt><![CDATA[mollit]]><![CDATA[anim]]></deserunt>
|
54
|
-
|
55
|
-
<!-- Test for whitespace preservation / squishing -->
|
56
|
-
<irure metadata="
|
57
|
-
dolor ">
|
58
|
-
reprehenderit </irure>
|
59
|
-
|
60
|
-
<!-- CDATA whitespace preservation test -->
|
61
|
-
<![CDATA[ foo
|
62
|
-
]]>
|
63
|
-
</lorem>
|