smile-xml 1.0.0-jruby → 1.0.2-jruby

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.
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>