smile-xml 1.0.0-jruby → 1.0.2-jruby

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/lib/smile-xml.jar +0 -0
  2. data/src/main/java/smile/xml/AttrJ.java +160 -0
  3. data/src/main/java/smile/xml/AttributesJ.java +212 -0
  4. data/src/main/java/smile/xml/BaseJ.java +60 -0
  5. data/src/main/java/smile/xml/DocumentJ.java +435 -0
  6. data/src/main/java/smile/xml/EncodingJ.java +94 -0
  7. data/src/main/java/smile/xml/ErrorJ.java +162 -0
  8. data/src/main/java/smile/xml/NamespaceJ.java +67 -0
  9. data/src/main/java/smile/xml/NamespacesJ.java +62 -0
  10. data/src/main/java/smile/xml/NodeJ.java +1029 -0
  11. data/src/main/java/smile/xml/NodeSetJ.java +90 -0
  12. data/src/main/java/smile/xml/ParserContextJ.java +44 -0
  13. data/src/main/java/smile/xml/ParserJ.java +196 -0
  14. data/src/main/java/smile/xml/ParserOptionsJ.java +58 -0
  15. data/src/main/java/smile/xml/ReaderJ.java +34 -0
  16. data/src/main/java/smile/xml/SchemaJ.java +66 -0
  17. data/src/main/java/smile/xml/SmileXML.java +65 -0
  18. data/src/main/java/smile/xml/XmlJ.java +58 -0
  19. data/src/main/java/smile/xml/sax/CallbackHandler.java +113 -0
  20. data/src/main/java/smile/xml/sax/SaxParserCallbacksJ.java +71 -0
  21. data/src/main/java/smile/xml/sax/SaxParserJ.java +153 -0
  22. data/src/main/java/smile/xml/util/UtilJ.java +424 -0
  23. data/src/main/java/smile/xml/xpath/CustomNamespaceContext.java +59 -0
  24. data/src/main/java/smile/xml/xpath/XPathContextJ.java +154 -0
  25. data/src/main/java/smile/xml/xpath/XPathExpressionJ.java +62 -0
  26. data/src/main/java/smile/xml/xpath/XPathJ.java +36 -0
  27. data/src/main/java/smile/xml/xpath/XPathObjectJ.java +196 -0
  28. data/src/main/java/smile/xml/xpath/XPointerJ.java +32 -0
  29. data/src/main/ruby/xml/libxml.rb +1 -0
  30. data/src/main/ruby/xml.rb +5 -0
  31. data/src/test/ruby/etc_doc_to_s.rb +21 -0
  32. data/src/test/ruby/ets_doc_file.rb +17 -0
  33. data/src/test/ruby/ets_doc_to_s.rb +23 -0
  34. data/src/test/ruby/ets_gpx.rb +28 -0
  35. data/src/test/ruby/ets_node_gc.rb +23 -0
  36. data/src/test/ruby/ets_test.xml +2 -0
  37. data/src/test/ruby/ets_tsr.rb +11 -0
  38. data/src/test/ruby/model/atom.xml +13 -0
  39. data/src/test/ruby/model/bands.iso-8859-1.xml +5 -0
  40. data/src/test/ruby/model/bands.utf-8.xml +5 -0
  41. data/src/test/ruby/model/bands.xml +5 -0
  42. data/src/test/ruby/model/books.xml +146 -0
  43. data/src/test/ruby/model/merge_bug_data.xml +58 -0
  44. data/src/test/ruby/model/ruby-lang.html +238 -0
  45. data/src/test/ruby/model/rubynet.xml +79 -0
  46. data/src/test/ruby/model/shiporder.rnc +28 -0
  47. data/src/test/ruby/model/shiporder.rng +86 -0
  48. data/src/test/ruby/model/shiporder.xml +23 -0
  49. data/src/test/ruby/model/shiporder.xsd +31 -0
  50. data/src/test/ruby/model/soap.xml +27 -0
  51. data/src/test/ruby/model/xinclude.xml +5 -0
  52. data/src/test/ruby/smile_xml_test.rb +64 -0
  53. data/src/test/ruby/tc_attr.rb +191 -0
  54. data/src/test/ruby/tc_attr_decl.rb +133 -0
  55. data/src/test/ruby/tc_attributes.rb +135 -0
  56. data/src/test/ruby/tc_deprecated_require.rb +13 -0
  57. data/src/test/ruby/tc_document.rb +162 -0
  58. data/src/test/ruby/tc_document_write.rb +212 -0
  59. data/src/test/ruby/tc_dtd.rb +125 -0
  60. data/src/test/ruby/tc_error.rb +150 -0
  61. data/src/test/ruby/tc_html_parser.rb +140 -0
  62. data/src/test/ruby/tc_namespace.rb +62 -0
  63. data/src/test/ruby/tc_namespaces.rb +210 -0
  64. data/src/test/ruby/tc_node.rb +273 -0
  65. data/src/test/ruby/tc_node_cdata.rb +51 -0
  66. data/src/test/ruby/tc_node_comment.rb +33 -0
  67. data/src/test/ruby/tc_node_copy.rb +42 -0
  68. data/src/test/ruby/tc_node_edit.rb +178 -0
  69. data/src/test/ruby/tc_node_text.rb +73 -0
  70. data/src/test/ruby/tc_node_write.rb +108 -0
  71. data/src/test/ruby/tc_node_xlink.rb +29 -0
  72. data/src/test/ruby/tc_parser.rb +371 -0
  73. data/src/test/ruby/tc_parser_context.rb +189 -0
  74. data/src/test/ruby/tc_properties.rb +40 -0
  75. data/src/test/ruby/tc_reader.rb +306 -0
  76. data/src/test/ruby/tc_relaxng.rb +54 -0
  77. data/src/test/ruby/tc_sax_parser.rb +340 -0
  78. data/src/test/ruby/tc_schema.rb +59 -0
  79. data/src/test/ruby/tc_traversal.rb +222 -0
  80. data/src/test/ruby/tc_xinclude.rb +21 -0
  81. data/src/test/ruby/tc_xml.rb +226 -0
  82. data/src/test/ruby/tc_xpath.rb +210 -0
  83. data/src/test/ruby/tc_xpath_context.rb +80 -0
  84. data/src/test/ruby/tc_xpath_expression.rb +38 -0
  85. data/src/test/ruby/tc_xpointer.rb +74 -0
  86. data/src/test/ruby/test_helper.rb +23 -0
  87. data/src/test/ruby/test_suite.rb +41 -0
  88. metadata +91 -5
@@ -0,0 +1,36 @@
1
+ package smile.xml.xpath;
2
+
3
+ import javax.xml.namespace.QName;
4
+ import javax.xml.xpath.XPathConstants;
5
+ import org.jruby.Ruby;
6
+ import org.jruby.RubyModule;
7
+ import org.jruby.anno.JRubyConstant;
8
+ import smile.xml.util.UtilJ;
9
+
10
+ public class XPathJ
11
+ {
12
+
13
+ @JRubyConstant
14
+ public static final QName UNDEFINED = null;
15
+
16
+ @JRubyConstant
17
+ public static final QName NODESET = XPathConstants.NODESET;
18
+
19
+ @JRubyConstant
20
+ public static final QName BOOLEAN = XPathConstants.BOOLEAN;
21
+
22
+ @JRubyConstant
23
+ public static final QName NUMBER = XPathConstants.NUMBER;
24
+
25
+ @JRubyConstant
26
+ public static final QName STRING = XPathConstants.STRING;
27
+
28
+ public static RubyModule define(Ruby runtime)
29
+ {
30
+ RubyModule parent = UtilJ.getModule(runtime, new String[] { "LibXML", "XML" });
31
+ RubyModule result = parent.defineModuleUnder("XPath");
32
+ result.defineAnnotatedMethods(XPathJ.class);
33
+ result.defineAnnotatedConstants(XPathJ.class);
34
+ return result;
35
+ }
36
+ }
@@ -0,0 +1,196 @@
1
+ package smile.xml.xpath;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.Arrays;
5
+ import java.util.List;
6
+
7
+ import javax.xml.xpath.XPath;
8
+ import javax.xml.xpath.XPathExpressionException;
9
+
10
+ import org.jruby.Ruby;
11
+ import org.jruby.RubyArray;
12
+ import org.jruby.RubyBoolean;
13
+ import org.jruby.RubyClass;
14
+ import org.jruby.RubyFixnum;
15
+ import org.jruby.RubyNumeric;
16
+ import org.jruby.RubyObject;
17
+ import org.jruby.RubyString;
18
+ import org.jruby.anno.JRubyClass;
19
+ import org.jruby.anno.JRubyMethod;
20
+ import org.jruby.runtime.Block;
21
+ import org.jruby.runtime.ObjectAllocator;
22
+ import org.jruby.runtime.ThreadContext;
23
+ import org.jruby.runtime.builtin.IRubyObject;
24
+ import org.w3c.dom.Document;
25
+ import org.w3c.dom.Node;
26
+ import org.w3c.dom.NodeList;
27
+
28
+ import smile.xml.BaseJ;
29
+ import smile.xml.NodeJ;
30
+ import smile.xml.NodeSetJ;
31
+ import smile.xml.util.UtilJ;
32
+
33
+ @JRubyClass( name="LibXML::XML::XPath::Object", include="Enumerable" )
34
+ public class XPathObjectJ extends RubyObject {
35
+
36
+ private static final long serialVersionUID = 4673137342270845475L;
37
+
38
+ private static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
39
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
40
+ return new XPathObjectJ(runtime, klass);
41
+ }
42
+ };
43
+
44
+
45
+ public static RubyClass define(Ruby runtime) {
46
+ return UtilJ.defineClass( runtime,XPathObjectJ.class, ALLOCATOR );
47
+ }
48
+
49
+ private static RubyClass getRubyClass(Ruby runtime) {
50
+ return UtilJ.getClass(runtime, XPathObjectJ.class );
51
+ }
52
+
53
+ public static XPathObjectJ newInstance(
54
+ ThreadContext context,
55
+ IRubyObject expression,
56
+ IRubyObject document,
57
+ IRubyObject[] namespaces) {
58
+ List<IRubyObject> args = new ArrayList<IRubyObject>();
59
+ args.add(expression);
60
+ args.add(document);
61
+ args.addAll(Arrays.asList(namespaces));
62
+ return (XPathObjectJ) getRubyClass(context.getRuntime()).newInstance(
63
+ context,
64
+ (IRubyObject[]) args.toArray(new IRubyObject[args.size()]),
65
+ null);
66
+ }
67
+
68
+ private String[] namespaces;
69
+ private RubyString expression;
70
+ private Node node;
71
+ private RubyArray result;
72
+
73
+ private XPathObjectJ(Ruby runtime, RubyClass metaClass) {
74
+ super(runtime, metaClass);
75
+ }
76
+
77
+ @JRubyMethod(name = "initialize", rest = true )
78
+ public void initialize(ThreadContext context, IRubyObject[] args) {
79
+
80
+ if( args[0] instanceof RubyString ) {
81
+ this.expression = (RubyString) args[0];
82
+ } else {
83
+ this.expression = ((XPathExpressionJ)args[0]).getExpression();
84
+ }
85
+
86
+ this.node = (Node) ((BaseJ<?>) args[1]).getJavaObject();
87
+
88
+ this.namespaces = new String[args.length - 2];
89
+ for (int i = 2; i < args.length; i++)
90
+ this.namespaces[(i - 2)] = args[i].asJavaString();
91
+
92
+ // System.out.println( Arrays.toString(namespaces));
93
+ }
94
+
95
+ @JRubyMethod(name = { "each" })
96
+ public void iterateOver(ThreadContext context, Block block)
97
+ throws Exception {
98
+ RubyArray array = getResult(context);
99
+ for (Object obj : array ) {
100
+ IRubyObject o = (IRubyObject) obj;
101
+ block.yield(context, o);
102
+ if (block.isEscaped())
103
+ break;
104
+ }
105
+ }
106
+
107
+ @JRubyMethod(name = { "length" }, alias = { "size" })
108
+ public RubyFixnum getLength(ThreadContext context) throws Exception {
109
+ return context.getRuntime().newFixnum(getResult(context).getLength());
110
+ }
111
+
112
+ @JRubyMethod(name ="string")
113
+ public RubyString getString(ThreadContext context) throws Exception {
114
+ return this.expression;
115
+ }
116
+
117
+ @JRubyMethod(name = { "first" })
118
+ public IRubyObject getFirst(ThreadContext context) throws Exception {
119
+ if (getResult(context).isEmpty())
120
+ return context.getRuntime().getNil();
121
+ return (NodeJ) getResult(context).get(0);
122
+ }
123
+
124
+ @JRubyMethod(name = "last" )
125
+ public IRubyObject getLast(ThreadContext context) throws Exception {
126
+ if (getResult(context).isEmpty())
127
+ return context.getRuntime().getNil();
128
+ return (NodeJ) getResult(context).last();
129
+ }
130
+
131
+ @JRubyMethod(name = { "xpath_type" })
132
+ public IRubyObject getXpathType(ThreadContext context) throws Exception {
133
+ return context.getRuntime().getNil();
134
+ }
135
+
136
+ @JRubyMethod(name = { "empty?" })
137
+ public RubyBoolean isEmpty(ThreadContext context) throws Exception {
138
+ return UtilJ.toBool(context, getResult(context).isEmpty());
139
+ }
140
+
141
+ @JRubyMethod(name = { "set" })
142
+ public IRubyObject getSet(ThreadContext context) throws Exception {
143
+ return NodeSetJ.newInstance(context, getResult(context));
144
+ }
145
+
146
+ @JRubyMethod(name = { "to_a" })
147
+ public IRubyObject toArray(ThreadContext context) throws Exception {
148
+ return getResult(context);
149
+ }
150
+
151
+ private RubyArray getResult(ThreadContext context) throws Exception {
152
+ if (this.result == null)
153
+ this.result = evaluateExpression(context);
154
+ return this.result;
155
+ }
156
+
157
+ @JRubyMethod(name = { "[]" })
158
+ public IRubyObject get(ThreadContext context, IRubyObject pIndex)
159
+ throws Exception {
160
+ RubyNumeric index = (RubyNumeric) pIndex;
161
+ RubyArray result = getResult(context);
162
+ return (IRubyObject) result.at( index );
163
+ }
164
+
165
+ @JRubyMethod(name = { "context" })
166
+ public IRubyObject getContext(ThreadContext context) {
167
+ return context.getRuntime().getNil();
168
+ }
169
+
170
+ private RubyArray evaluateExpression(ThreadContext context) throws Exception {
171
+ XPath xpath = UtilJ.newXPath();
172
+
173
+ Node nn = (this.node instanceof Document) ? ((Document) this.node)
174
+ .getDocumentElement() : this.node.getOwnerDocument();
175
+
176
+ xpath.setNamespaceContext( new CustomNamespaceContext( nn, this.namespaces) );
177
+ NodeList list;
178
+ try {
179
+ list = (NodeList) xpath.evaluate(this.expression.asJavaString(), this.node, XPathJ.NODESET);
180
+ } catch (XPathExpressionException e) {
181
+ if ((e.getCause() instanceof Exception))
182
+ throw ((Exception) e.getCause());
183
+ throw e;
184
+ }
185
+
186
+ List<IRubyObject> array = new ArrayList<IRubyObject>();
187
+ for (int i = 0; i < list.getLength(); i++) {
188
+ NodeJ node = NodeJ.newInstance(context);
189
+ //node.setDocPresent( this.node instanceof Document ? true : ((Node)).isDocPresent() );
190
+ node.setJavaObject(list.item(i));
191
+ array.add(node);
192
+ }
193
+
194
+ return context.getRuntime().newArray(array);
195
+ }
196
+ }
@@ -0,0 +1,32 @@
1
+ package smile.xml.xpath;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.RubyClass;
5
+ import org.jruby.RubyObject;
6
+ import org.jruby.anno.JRubyClass;
7
+ import org.jruby.runtime.ObjectAllocator;
8
+ import org.jruby.runtime.builtin.IRubyObject;
9
+
10
+ import smile.xml.util.UtilJ;
11
+
12
+ @JRubyClass(name = "LibXML::XML::XPath::XPointer")
13
+ public class XPointerJ extends RubyObject {
14
+
15
+ private static final long serialVersionUID = -7924934418493439093L;
16
+
17
+ private static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
18
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
19
+ return new XPointerJ(runtime, klass);
20
+ }
21
+ };
22
+
23
+ public static RubyClass define(Ruby runtime) {
24
+ return UtilJ.defineClass( runtime, XPointerJ.class, ALLOCATOR );
25
+ }
26
+
27
+ private XPointerJ(Ruby runtime, RubyClass metaClass) {
28
+ super(runtime, metaClass);
29
+ }
30
+
31
+
32
+ }
@@ -0,0 +1 @@
1
+ require 'xml'
@@ -0,0 +1,5 @@
1
+ require 'java'
2
+ require File.join( File.dirname( __FILE__), 'smile-xml.jar' )
3
+
4
+ ruby = JRuby.runtime
5
+ Java::smile.xml.SmileXML.define(ruby);
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+ 1.times do |count|
6
+
7
+ xml_doc = XML::Document.new()
8
+ xml_doc.encoding = "UTF-8"
9
+ xml_doc.root = XML::Node.new("Request")
10
+
11
+ 1000.times do |index|
12
+ xml_doc.root << node = XML::Node.new("row")
13
+ node["user_id"] = index.to_s
14
+ node << "600445"
15
+ end
16
+
17
+ xml_str = xml_doc.to_s
18
+ print "\r#{count}"
19
+ $stdout.flush
20
+ end
21
+ puts "\n"
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+ # This is related to bug 8337, complaint is on amd64/fbsd
6
+ # unknown if it happens on other amd64/os combos
7
+
8
+ Process.setrlimit(Process::RLIMIT_NOFILE,10005)
9
+
10
+ (1..10000).each{|time|
11
+ XML::Document.file(File.join(File.dirname(__FILE__),'ets_test.xml'))
12
+ if time % 100 == 0
13
+ print "\r#{time}"
14
+ $stdout.flush
15
+ end
16
+ }
17
+ puts "\n"
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+ 100.times do |count|
6
+
7
+ xml_doc = XML::Document.new()
8
+ xml_doc.encoding = "UTF-8"
9
+ xml_doc.root = XML::Node.new("Request")
10
+
11
+ 1000.times do |index|
12
+
13
+ xml_doc.root << node = XML::Node.new("row")
14
+ node["user_id"] = index.to_s
15
+ node << "600445"
16
+
17
+ end
18
+
19
+ xml_str = xml_doc.to_s
20
+ print "\r#{count}"
21
+ $stdout.flush
22
+ end
23
+ puts "\n"
@@ -0,0 +1,28 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'libxml'
4
+
5
+ 100.times do
6
+ doc = XML::Document.new
7
+ doc.encoding = 'UTF-8'
8
+
9
+ root = XML::Node.new 'gpx'
10
+ root['version'] = '1.0'
11
+ root['creator'] = 'OpenStreetMap.org'
12
+ root['xmlns'] = "http://www.topografix.com/GPX/1/0/"
13
+
14
+ doc.root = root
15
+
16
+ track = XML::Node.new 'trk'
17
+ doc.root << track
18
+
19
+ trkseg = XML::Node.new 'trkseg'
20
+ track << trkseg
21
+
22
+ 1.upto(1000) do |n|
23
+ trkpt = XML::Node.new 'trkpt'
24
+ trkpt['lat'] = n.to_s
25
+ trkpt['lon'] = n.to_s
26
+ trkseg << trkpt
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+ # test of bug 13310, clears MEM2
6
+
7
+ include GC
8
+
9
+ inner = XML::Node.new('inner')
10
+ save = nil
11
+ 1.times do
12
+ outer = XML::Node.new('outer')
13
+ outer.child = inner
14
+ 1.times do
15
+ doc = XML::Document.new
16
+ doc.root = outer
17
+ # Uncomment the following line and it won't crash
18
+ save = doc
19
+ end
20
+ garbage_collect
21
+ end
22
+ garbage_collect
23
+ puts inner
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0"?>
2
+ <test/>
@@ -0,0 +1,11 @@
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+ 10_000.times {|n|
6
+ j=XML::Node.new2(nil,"happy#{n}")
7
+ 10.times {|r|
8
+ j1=XML::Node.new("happy#{r}","farts")
9
+ j.child=j1
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <?xml-stylesheet type="text/xsl" href="my_stylesheet.xsl"?>
3
+ <feed xmlns="http://www.w3.org/2005/Atom">
4
+ <!-- Not a valid atom entry -->
5
+ <entry>
6
+ <title type="html"><![CDATA[<<strong>>]]></title>
7
+ <content type="xhtml">
8
+ <xhtml:div xmlns:xhtml="http://www.w3.org/1999/xhtml">
9
+ <xhtml:p>hi there</xhtml:p>
10
+ </xhtml:div>
11
+ </content>
12
+ </entry>
13
+ </feed>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <bands genre="metal">
3
+ <m�tley_cr�e country="us">M�tley Cr�e is an American heavy metal band formed in Los Angeles, California in 1981.</m�tley_cr�e>
4
+ <iron_maiden country="uk">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>
5
+ </bands>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <bands genre="metal">
3
+ <mötley_crüe country="us">Mötley Crüe is an American heavy metal band formed in Los Angeles, California in 1981.</mötley_crüe>
4
+ <iron_maiden country="uk">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>
5
+ </bands>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <bands genre="metal">
3
+ <mötley_crüe country="us">An American heavy metal band formed in Los Angeles, California in 1981.</mötley_crüe>
4
+ <iron_maiden country="uk">British heavy metal band formed in 1975.</iron_maiden>
5
+ </bands>
@@ -0,0 +1,146 @@
1
+ <?xml version="1.0"?>
2
+ <!-- Sample xml file from Microsoft.
3
+ See http://msdn.microsoft.com/en-us/library/ms762271(VS.85).aspx -->
4
+ <catalog>
5
+ <book id="bk101">
6
+ <author>Gambardella, Matthew</author>
7
+ <title>XML Developer's Guide</title>
8
+ <genre>Computer</genre>
9
+ <price>44.95</price>
10
+ <publish_date>2000-10-01</publish_date>
11
+ <description>
12
+ An in-depth look at creating applications
13
+ with XML.
14
+ </description>
15
+ </book>
16
+ <book id="bk102">
17
+ <author>Ralls, Kim</author>
18
+ <title>Midnight Rain</title>
19
+ <genre>Fantasy</genre>
20
+ <price>5.95</price>
21
+ <publish_date>2000-12-16</publish_date>
22
+ <description>
23
+ A former architect battles corporate zombies,
24
+ an evil sorceress, and her own childhood to become queen
25
+ of the world.
26
+ </description>
27
+ </book>
28
+ <book id="bk103">
29
+ <author>Corets, Eva</author>
30
+ <title>Maeve Ascendant</title>
31
+ <genre>Fantasy</genre>
32
+ <price>5.95</price>
33
+ <publish_date>2000-11-17</publish_date>
34
+ <description>
35
+ After the collapse of a nanotechnology
36
+ society in England, the young survivors lay the
37
+ foundation for a new society.
38
+ </description>
39
+ </book>
40
+ <book id="bk104">
41
+ <author>Corets, Eva</author>
42
+ <title>Oberon's Legacy</title>
43
+ <genre>Fantasy</genre>
44
+ <price>5.95</price>
45
+ <publish_date>2001-03-10</publish_date>
46
+ <description>
47
+ In post-apocalypse England, the mysterious
48
+ agent known only as Oberon helps to create a new life
49
+ for the inhabitants of London. Sequel to Maeve
50
+ Ascendant.
51
+ </description>
52
+ </book>
53
+ <book id="bk105">
54
+ <author>Corets, Eva</author>
55
+ <title>The Sundered Grail</title>
56
+ <genre>Fantasy</genre>
57
+ <price>5.95</price>
58
+ <publish_date>2001-09-10</publish_date>
59
+ <description>
60
+ The two daughters of Maeve, half-sisters,
61
+ battle one another for control of England. Sequel to
62
+ Oberon's Legacy.
63
+ </description>
64
+ </book>
65
+ <book id="bk106">
66
+ <author>Randall, Cynthia</author>
67
+ <title>Lover Birds</title>
68
+ <genre>Romance</genre>
69
+ <price>4.95</price>
70
+ <publish_date>2000-09-02</publish_date>
71
+ <description>
72
+ When Carla meets Paul at an ornithology
73
+ conference, tempers fly as feathers get ruffled.
74
+ </description>
75
+ </book>
76
+ <book id="bk107">
77
+ <author>Thurman, Paula</author>
78
+ <title>Splish Splash</title>
79
+ <genre>Romance</genre>
80
+ <price>4.95</price>
81
+ <publish_date>2000-11-02</publish_date>
82
+ <description>
83
+ A deep sea diver finds true love twenty
84
+ thousand leagues beneath the sea.
85
+ </description>
86
+ </book>
87
+ <book id="bk108">
88
+ <author>Knorr, Stefan</author>
89
+ <title>Creepy Crawlies</title>
90
+ <genre>Horror</genre>
91
+ <price>4.95</price>
92
+ <publish_date>2000-12-06</publish_date>
93
+ <description>
94
+ An anthology of horror stories about roaches,
95
+ centipedes, scorpions and other insects.
96
+ </description>
97
+ </book>
98
+ <book id="bk109">
99
+ <author>Kress, Peter</author>
100
+ <title>Paradox Lost</title>
101
+ <genre>Science Fiction</genre>
102
+ <price>6.95</price>
103
+ <publish_date>2000-11-02</publish_date>
104
+ <description>
105
+ After an inadvertant trip through a Heisenberg
106
+ Uncertainty Device, James Salway discovers the problems
107
+ of being quantum.
108
+ </description>
109
+ </book>
110
+ <book id="bk110">
111
+ <author>O'Brien, Tim</author>
112
+ <title>Microsoft .NET: The Programming Bible</title>
113
+ <genre>Computer</genre>
114
+ <price>36.95</price>
115
+ <publish_date>2000-12-09</publish_date>
116
+ <description>
117
+ Microsoft's .NET initiative is explored in
118
+ detail in this deep programmer's reference.
119
+ </description>
120
+ </book>
121
+ <book id="bk111">
122
+ <author>O'Brien, Tim</author>
123
+ <title>MSXML3: A Comprehensive Guide</title>
124
+ <genre>Computer</genre>
125
+ <price>36.95</price>
126
+ <publish_date>2000-12-01</publish_date>
127
+ <description>
128
+ The Microsoft MSXML3 parser is covered in
129
+ detail, with attention to XML DOM interfaces, XSLT processing,
130
+ SAX and more.
131
+ </description>
132
+ </book>
133
+ <book id="bk112">
134
+ <author>Galos, Mike</author>
135
+ <title>Visual Studio 7: A Comprehensive Guide</title>
136
+ <genre>Computer</genre>
137
+ <price>49.95</price>
138
+ <publish_date>2001-04-16</publish_date>
139
+ <description>
140
+ Microsoft Visual Studio 7 is explored in depth,
141
+ looking at how Visual Basic, Visual C++, C#, and ASP+ are
142
+ integrated into a comprehensive development
143
+ environment.
144
+ </description>
145
+ </book>
146
+ </catalog>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <template>
3
+ <body>
4
+ <section>
5
+ <txt>Some Preset Data Here</txt>
6
+ <txt>Some Preset Data Here</txt>
7
+ <txt>name: quack!</txt>
8
+ <txt>Some Preset Data Here</txt>
9
+ <txt>Some Preset Data Here</txt>
10
+ <txt>Some Preset Data Here</txt>
11
+ <txt>Some Preset Data Here</txt>
12
+ <txt>city: quack!</txt>
13
+ <txt>Some Preset Data Here</txt>
14
+ <txt>Some Preset Data Here</txt>
15
+ <txt>Some Preset Data Here</txt>
16
+ <txt>Some Preset Data Here</txt>
17
+ <txt>state: quack!</txt>
18
+ <txt>Some Preset Data Here</txt>
19
+ <txt>Some Preset Data Here</txt>
20
+ <txt>Some Preset Data Here</txt>
21
+ <txt>Some Preset Data Here</txt>
22
+ <row>
23
+ <txt>year: Vroom!</txt>
24
+ <txt>make: Vroom!</txt>
25
+ <txt>model: Vroom!</txt>
26
+ </row>
27
+ <row>
28
+ <txt>year: Vroom!</txt>
29
+ <txt>make: Vroom!</txt>
30
+ <txt>model: Vroom!</txt>
31
+ </row>
32
+ <row>
33
+ <txt>year: Vroom!</txt>
34
+ <txt>make: Vroom!</txt>
35
+ <txt>model: Vroom!</txt>
36
+ </row>
37
+ <txt>Some Preset Data Here</txt>
38
+ <txt>Some Preset Data Here</txt>
39
+ <row>
40
+ <txt>year: Vroom!</txt>
41
+ <txt>make: Vroom!</txt>
42
+ <txt>model: Vroom!</txt>
43
+ </row>
44
+ <row>
45
+ <txt>year: Vroom!</txt>
46
+ <txt>make: Vroom!</txt>
47
+ <txt>model: Vroom!</txt>
48
+ </row>
49
+ <row>
50
+ <txt>year: Vroom!</txt>
51
+ <txt>make: Vroom!</txt>
52
+ <txt>model: Vroom!</txt>
53
+ </row>
54
+ <txt>Some Preset Data Here</txt>
55
+ <txt>Some Preset Data Here</txt>
56
+ </section>
57
+ </body>
58
+ </template>