libxml-ruby 0.3.6

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 (74) hide show
  1. data/CHANGELOG +49 -0
  2. data/LICENSE +22 -0
  3. data/README +129 -0
  4. data/Rakefile +197 -0
  5. data/TODO +84 -0
  6. data/ext/xml/cbg.c +76 -0
  7. data/ext/xml/extconf.rb +95 -0
  8. data/ext/xml/libxml.c +86 -0
  9. data/ext/xml/libxml.h +79 -0
  10. data/ext/xml/ruby_xml_attr.c +372 -0
  11. data/ext/xml/ruby_xml_attr.h +21 -0
  12. data/ext/xml/ruby_xml_attribute.c +224 -0
  13. data/ext/xml/ruby_xml_attribute.h +21 -0
  14. data/ext/xml/ruby_xml_document.c +1159 -0
  15. data/ext/xml/ruby_xml_document.h +27 -0
  16. data/ext/xml/ruby_xml_dtd.c +168 -0
  17. data/ext/xml/ruby_xml_dtd.h +17 -0
  18. data/ext/xml/ruby_xml_input_cbg.c +167 -0
  19. data/ext/xml/ruby_xml_input_cbg.h +21 -0
  20. data/ext/xml/ruby_xml_node.c +2052 -0
  21. data/ext/xml/ruby_xml_node.h +28 -0
  22. data/ext/xml/ruby_xml_node_set.c +197 -0
  23. data/ext/xml/ruby_xml_node_set.h +26 -0
  24. data/ext/xml/ruby_xml_ns.c +153 -0
  25. data/ext/xml/ruby_xml_ns.h +21 -0
  26. data/ext/xml/ruby_xml_parser.c +1363 -0
  27. data/ext/xml/ruby_xml_parser.h +31 -0
  28. data/ext/xml/ruby_xml_parser_context.c +715 -0
  29. data/ext/xml/ruby_xml_parser_context.h +22 -0
  30. data/ext/xml/ruby_xml_sax_parser.c +181 -0
  31. data/ext/xml/ruby_xml_sax_parser.h +21 -0
  32. data/ext/xml/ruby_xml_schema.c +142 -0
  33. data/ext/xml/ruby_xml_schema.h +16 -0
  34. data/ext/xml/ruby_xml_tree.c +43 -0
  35. data/ext/xml/ruby_xml_tree.h +12 -0
  36. data/ext/xml/ruby_xml_xinclude.c +20 -0
  37. data/ext/xml/ruby_xml_xinclude.h +13 -0
  38. data/ext/xml/ruby_xml_xpath.c +357 -0
  39. data/ext/xml/ruby_xml_xpath.h +24 -0
  40. data/ext/xml/ruby_xml_xpath_context.c +124 -0
  41. data/ext/xml/ruby_xml_xpath_context.h +24 -0
  42. data/ext/xml/ruby_xml_xpointer.c +100 -0
  43. data/ext/xml/ruby_xml_xpointer.h +27 -0
  44. data/ext/xml/ruby_xml_xpointer_context.c +22 -0
  45. data/ext/xml/ruby_xml_xpointer_context.h +18 -0
  46. data/tests/copy_bug.rb +21 -0
  47. data/tests/dtd-test.rb +24 -0
  48. data/tests/model/default_validation_bug.rb +0 -0
  49. data/tests/model/rubynet.xml +78 -0
  50. data/tests/model/rubynet_project +13 -0
  51. data/tests/model/xinclude.xml +5 -0
  52. data/tests/runner.rb +13 -0
  53. data/tests/schema-test.rb +74 -0
  54. data/tests/tc_default_validation.rb +0 -0
  55. data/tests/tc_xml_document.rb +51 -0
  56. data/tests/tc_xml_document_write.rb +25 -0
  57. data/tests/tc_xml_document_write2.rb +55 -0
  58. data/tests/tc_xml_document_write3.rb +97 -0
  59. data/tests/tc_xml_node.rb +59 -0
  60. data/tests/tc_xml_node2.rb +26 -0
  61. data/tests/tc_xml_node_set.rb +25 -0
  62. data/tests/tc_xml_node_xlink.rb +28 -0
  63. data/tests/tc_xml_parser.rb +175 -0
  64. data/tests/tc_xml_parser2.rb +17 -0
  65. data/tests/tc_xml_parser3.rb +23 -0
  66. data/tests/tc_xml_parser4.rb +33 -0
  67. data/tests/tc_xml_parser5.rb +27 -0
  68. data/tests/tc_xml_parser6.rb +23 -0
  69. data/tests/tc_xml_parser7.rb +28 -0
  70. data/tests/tc_xml_parser_context.rb +89 -0
  71. data/tests/tc_xml_xinclude.rb +30 -0
  72. data/tests/tc_xml_xpath.rb +23 -0
  73. data/tests/tc_xml_xpointer.rb +78 -0
  74. metadata +144 -0
data/CHANGELOG ADDED
@@ -0,0 +1,49 @@
1
+ ===== 21.2.2006 Ross Bamford <rosco@roscopeco.co.uk>
2
+ * Patched extconf.rb with OSX -fno-common workaround
3
+ * Added gem and packaging support to Rakefile
4
+ * Moved version update to Rakefile
5
+ * Removed legacy project utility scripts
6
+
7
+ ===== 19.2.2006 Ross Bamford <rosco@roscopeco.co.uk>
8
+ * Fixed doublefree bug in ruby_xml_attr.
9
+ * Fixed small leak in parser
10
+
11
+ ===== 18.12.2005 Ross Bamford <rosco@roscopeco.co.uk>
12
+ * Updated for GCC 4.0 (community patches)
13
+ * Fixed default validation bug
14
+ * Refactored project, removed outdated files, cleaned up tests.
15
+ * Added RDoc documentation across .c files.
16
+ * Fixed up a few strings.
17
+
18
+ ===== 14.4.2004 Mangler Jurgen <et@wkv.at>
19
+ * ruby_xml_node.cz: fixed ruby_xml_node_property_set. The ill-behaviour
20
+ was, that there was added a second attribute of the same
21
+ name, when you were setting the value of an already existing
22
+ attribute.
23
+
24
+ ===== 17.3.2004 Lukas Svoboda <luks@fi.muni.cz>
25
+ * ruby_xml_node.c: ruby_xml_node_to_s now returns XML subtree dump.
26
+
27
+ ===== 27.2.2004 Martin Povolny <martin@solnet.cz>
28
+ * ruby_xml_node.c: added XML::Node.copy, this makes possible building
29
+ of xml documents from nodes taken from other xml documents
30
+ without making ruby SIGSEGV (see tests/copy_bug.rb).
31
+
32
+ ===== 26.2.2004 Martin Povolny <martin@solnet.cz>
33
+ * ruby_xml_dtd.c, ruby_xml_dtd.h, ruby_xml_schema.c, ruby_xml_schema.h:
34
+ more work on validation, now you can actually validate
35
+ document using dtd or xml schema, also solved warning and
36
+ error propagation (see tests/{dtd|schema}-test.rb).
37
+
38
+ ===== 30.12.2003 Martin Povolny <martin@solnet.cz>
39
+ * ruby_xml_dtd.c, ruby_xml_dtd.h, ruby_xml_schema.c, ruby_xml_schema.h:
40
+ prelimitary support for dtd and schema validation
41
+
42
+ ===== 15.9.2003 Martin Povolny <martin@solnet.cz>
43
+ * ruby_xml_input_cbg.c, libxml.c: added class InputCallbacks to make
44
+ possible registering custom input callbacks
45
+ handlers (xmlRegisterInputCallbacks) written in ruby
46
+
47
+ ===== 1.8.2003 Martin Povolny <martin@solnet.cz>
48
+ * ruby_xml_document.c: corrected argument handling in ruby_xml_document_find
49
+ * ruby_xml_node.c: corrected argument handling in ruby_xml_node_find
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ # $Id: LICENSE,v 1.2 2005/12/29 19:00:01 bshow Exp $
2
+
3
+ Copyright (c) 2002-2005 Sean Chittenden <sean@chittenden.org> and contributors
4
+ Copyright (c) 2001 Wai-Sun "Squidster" Chia <waisun.chia@compaq.com>
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
7
+ this software and associated documentation files (the "Software"), to deal in
8
+ the Software without restriction, including without limitation the rights to
9
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
10
+ of the Software, and to permit persons to whom the Software is furnished to do
11
+ so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
data/README ADDED
@@ -0,0 +1,129 @@
1
+ == INSTALLATION
2
+
3
+ Installation is simple. Follow the following steps:
4
+
5
+ $ ruby extconf.rb
6
+ $ make
7
+ # make install
8
+
9
+ If extconf yacks up an error, follow the instructions it provides.
10
+ Once installed, look at the test scripts (*.rb, not extconf.rb) and
11
+ make sure you run document_self.rb to see what's available.
12
+
13
+ == DEPENDENCIES
14
+
15
+ libxml requires a few other libraries to be installed inorder to
16
+ function properly.
17
+
18
+ * libm (math routines: very standard)
19
+ * libz (zlib)
20
+ * libiconv
21
+ * libxml2
22
+
23
+ == USAGE
24
+
25
+ Basic usage for reading and writing documents.
26
+
27
+ === WRITING
28
+
29
+ Writing a simple document:
30
+
31
+ require 'xml/libxml'
32
+ doc = XML::Document.new()
33
+ doc.root = XML::Node.new('root_node')
34
+ root = doc.root
35
+
36
+ root << elem1 = XML::Node.new('elem1')
37
+ elem1['attr1'] = 'val1'
38
+ elem1['attr2'] = 'val2'
39
+
40
+ root << elem2 = XML::Node.new('elem2')
41
+ elem2['attr1'] = 'val1'
42
+ elem2['attr2'] = 'val2'
43
+
44
+ root << elem3 = XML::Node.new('elem3')
45
+ elem3 << elem4 = XML::Node.new('elem4')
46
+ elem3 << elem5 = XML::Node.new('elem5')
47
+
48
+ elem5 << elem6 = XML::Node.new('elem6')
49
+ elem6 << 'Content for element 6'
50
+
51
+ elem3['attr'] = 'baz'
52
+
53
+ # Namespace hack to reduce the numer of times XML:: is typed
54
+ include XML
55
+ root << elem7 = Node.new('foo')
56
+ 1.upto(10) do |i|
57
+ elem7 << n = Node.new('bar')
58
+ n << i
59
+ end
60
+
61
+ format = true
62
+ doc.save('output.xml', format)
63
+
64
+ The file output.xml contains:
65
+
66
+ <?xml version="1.0"?>
67
+ <root_node>
68
+ <elem1 attr1="val1" attr2="val2"/>
69
+ <elem2 attr1="val1" attr2="val2"/>
70
+ <elem3 attr="baz">
71
+ <elem4/>
72
+ <elem5>
73
+ <elem6>Content for element 6</elem6>
74
+ </elem5>
75
+ </elem3>
76
+ <foo>
77
+ <bar>1</bar>
78
+ <bar>2</bar>
79
+ <bar>3</bar>
80
+ <bar>4</bar>
81
+ <bar>5</bar>
82
+ <bar>6</bar>
83
+ <bar>7</bar>
84
+ <bar>8</bar>
85
+ <bar>9</bar>
86
+ <bar>10</bar>
87
+ </foo>
88
+ </root_node>
89
+
90
+ === READING
91
+
92
+ Reading XML is slightly more complex and there are many more ways to
93
+ perform this operation. This reads in and processes the above
94
+ generated XML document, output.xml. This script assumes that the
95
+ structure of the document is already known.
96
+
97
+ require 'xml/libxml'
98
+ doc = XML::Document.file('output.xml')
99
+ root = doc.root
100
+
101
+ puts "Root element name: #{root.name}"
102
+
103
+ elem3 = root.find('elem3').to_a.first
104
+ puts "Elem3: #{elem3['attr']}"
105
+
106
+ doc.find('//root_node/foo/bar').each do |node|
107
+ puts "Node path: #{node.path} \t Contents: #{node}"
108
+ end
109
+
110
+ And your terminal should look like:
111
+
112
+ Root element name: root_node
113
+ Elem3: baz
114
+ Node path: /root_node/foo/bar[1] Contents: 1
115
+ Node path: /root_node/foo/bar[2] Contents: 2
116
+ Node path: /root_node/foo/bar[3] Contents: 3
117
+ Node path: /root_node/foo/bar[4] Contents: 4
118
+ Node path: /root_node/foo/bar[5] Contents: 5
119
+ Node path: /root_node/foo/bar[6] Contents: 6
120
+ Node path: /root_node/foo/bar[7] Contents: 7
121
+ Node path: /root_node/foo/bar[8] Contents: 8
122
+ Node path: /root_node/foo/bar[9] Contents: 9
123
+ Node path: /root_node/foo/bar[10] Contents: 10
124
+
125
+ == MORE INFORMATION
126
+
127
+ If you have any questions, please send email to libxml-devel@rubyforge.org.
128
+
129
+ # $Id: README,v 1.2 2005/12/19 20:51:39 roscopeco Exp $
data/Rakefile ADDED
@@ -0,0 +1,197 @@
1
+ require 'net/ftp'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/gempackagetask'
6
+
7
+ CLEAN.include '**/*.o'
8
+ CLEAN.include '**/*.so'
9
+ CLEAN.include 'html'
10
+ CLOBBER.include '**/*.log'
11
+ CLOBBER.include '**/Makefile'
12
+ CLOBBER.include '**/extconf.h'
13
+
14
+ desc "Default Task (Build release)"
15
+ task :default => :release
16
+
17
+ # Determine the current version of the software
18
+ if File.read('ext/xml/libxml.h') =~ /\s*RUBY_LIBXML_VERSION\s*['"](\d.+)['"]/
19
+ CURRENT_VERSION = $1
20
+ else
21
+ CURRENT_VERSION = "0.0.0"
22
+ end
23
+
24
+ if ENV['REL']
25
+ PKG_VERSION = ENV['REL']
26
+ else
27
+ PKG_VERSION = CURRENT_VERSION
28
+ end
29
+
30
+ task :test_ver do
31
+ puts PKG_VERSION
32
+ end
33
+
34
+ # Make tasks -----------------------------------------------------
35
+ MAKECMD = ENV['MAKE_CMD'] || 'make'
36
+ MAKEOPTS = ENV['MAKE_OPTS'] || ''
37
+
38
+ file 'ext/xml/Makefile' => 'ext/xml/extconf.rb' do
39
+ Dir.chdir('ext/xml') do
40
+ ruby 'extconf.rb'
41
+ end
42
+ end
43
+
44
+ def make(target = '')
45
+ Dir.chdir('ext/xml') do
46
+ pid = fork { exec "#{MAKECMD} #{MAKEOPTS} #{target}" }
47
+ Process.waitpid pid
48
+ end
49
+ $?.exitstatus
50
+ end
51
+
52
+ # Let make handle dependencies between c/o/so - we'll just run it.
53
+ file 'ext/xml/libxml.so' => 'ext/xml/Makefile' do
54
+ m = make
55
+ fail "Make failed (status #{m})" unless m == 0
56
+ end
57
+
58
+ desc "Compile the shared object"
59
+ task :compile => 'ext/xml/libxml.so'
60
+
61
+ desc "Install to your site_ruby directory"
62
+ task :install => :compile do
63
+ m = make 'install'
64
+ fail "Make install failed (status #{m})" unless m == 0
65
+ end
66
+
67
+ # Test Tasks ---------------------------------------------------------
68
+ task :ta => :alltests
69
+ task :tu => :unittests
70
+ task :test => :unittests
71
+
72
+ Rake::TestTask.new(:alltests) do |t|
73
+ t.test_files = FileList[
74
+ 'tests/tc_*.rb',
75
+ 'tests/contrib/*.rb',
76
+ ]
77
+ t.verbose = true
78
+ end
79
+
80
+ Rake::TestTask.new(:unittests) do |t|
81
+ t.test_files = FileList['tests/tc_*.rb']
82
+ t.verbose = false
83
+ end
84
+
85
+ #Rake::TestTask.new(:funtests) do |t|
86
+ # t.test_files = FileList['test/fun*.rb']
87
+ #t.warning = true
88
+ #t.warning = true
89
+ #end
90
+
91
+ task :unittests => :compile
92
+ task :alltests => :compile
93
+
94
+ # RDoc Tasks ---------------------------------------------------------
95
+ desc "Create the RDOC documentation tree"
96
+ rd = Rake::RDocTask.new(:doc) do |rdoc|
97
+ rdoc.rdoc_dir = 'html'
98
+ rdoc.title = "Libxml-Ruby API"
99
+ rdoc.options << '--main' << 'README'
100
+ rdoc.rdoc_files.include('README', 'LICENSE', 'TODO')
101
+ rdoc.rdoc_files.include('ext/xml/ruby_xml*.c', '*.rdoc')
102
+ end
103
+
104
+ desc "Publish the RDoc documentation to project web site"
105
+ task :pubdoc => [ :doc ] do
106
+ unless ENV['RUBYFORGE_ACCT']
107
+ raise "Need to set RUBYFORGE_ACCT to your rubyforge.org user name (e.g. 'fred')"
108
+ end
109
+ require 'rake/contrib/sshpublisher'
110
+ Rake::SshDirPublisher.new(
111
+ "#{ENV['RUBYFORGE_ACCT']}@rubyforge.org",
112
+ "/var/www/gforge-projects/libxml/doc",
113
+ "html"
114
+ ).upload
115
+ end
116
+
117
+ # Packaging / Version number tasks -----------------------------------
118
+ # Used during release packaging if a REL is supplied
119
+ task :update_version do
120
+ unless PKG_VERSION == CURRENT_VERSION
121
+ File.open('ext/xml/libxml.h.new','w+') do |f|
122
+ f << File.read('ext/xml/libxml.h').
123
+ gsub(/RUBY_LIBXML_VERSION\s+"(\d.+)"/) { "RUBY_LIBXML_VERSION \"#{PKG_VERSION}\"" }.
124
+ gsub(/RUBY_LIBXML_VERNUM\s+\d+/) { "RUBY_LIBXML_VERNUM #{PKG_VERSION.tr('.','')}" }
125
+ end
126
+ mv('ext/xml/libxml.h.new', 'ext/xml/libxml.h')
127
+ end
128
+ end
129
+
130
+ PKG_FILES = FileList[
131
+ 'ext/xml/extconf.rb',
132
+ '[A-Z]*',
133
+ 'ext/xml/*.c',
134
+ 'ext/xml/ruby_xml*.h',
135
+ 'ext/xml/libxml.h',
136
+ 'tests/**/*',
137
+ ]
138
+
139
+ if ! defined?(Gem)
140
+ warn "Package Target requires RubyGEMs"
141
+ else
142
+ spec = Gem::Specification.new do |s|
143
+
144
+ #### Basic information.
145
+
146
+ s.name = 'libxml-ruby'
147
+ s.version = PKG_VERSION
148
+ s.summary = "LibXML2 bindings for Ruby"
149
+ s.description = <<-EOF
150
+ C-language bindings for Gnome LibXML2 and Ruby. Supports
151
+ high-speed, feature rich XML processing in Ruby apps.
152
+ EOF
153
+ s.extensions = 'ext/xml/extconf.rb'
154
+
155
+ #### Which files are to be included in this gem?
156
+
157
+ s.files = PKG_FILES.to_a
158
+
159
+ #### Load-time details
160
+ s.require_path = 'ext'
161
+
162
+ #### Documentation and testing.
163
+ s.has_rdoc = true
164
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
165
+ s.rdoc_options <<
166
+ '--title' << 'Libxml-Ruby API' <<
167
+ '--main' << 'README' <<
168
+ '-o' << 'rdoc'
169
+
170
+ s.test_files = Dir.glob('tests/*runner.rb')
171
+
172
+ #### Author and project details.
173
+
174
+ s.author = "Sean Chittenden"
175
+ s.email = "libxml-devel@rubyforge.org"
176
+ s.homepage = "http://libxml.rubyforge.org"
177
+ s.rubyforge_project = "libxml"
178
+ end
179
+
180
+ # Quick fix for Ruby 1.8.3 / YAML bug
181
+ if (RUBY_VERSION == '1.8.3')
182
+ def spec.to_yaml
183
+ out = super
184
+ out = '--- ' + out unless out =~ /^---/
185
+ out
186
+ end
187
+ end
188
+
189
+ package_task = Rake::GemPackageTask.new(spec) do |pkg|
190
+ pkg.need_zip = true
191
+ pkg.need_tar_gz = true
192
+ pkg.package_dir = 'pkg'
193
+ end
194
+
195
+ desc "Build a full release"
196
+ task :release => [:clobber, :update_version, :compile, :test, :package]
197
+ end
data/TODO ADDED
@@ -0,0 +1,84 @@
1
+ $Id: TODO,v 1.1 2005/12/19 19:53:07 roscopeco Exp $
2
+
3
+ ==== BUGS
4
+
5
+ * Hunt down a 4-8KB/s leak while running rubytest -i0 -F on the library.
6
+
7
+ * Also some other C-side problems:
8
+ * doublefree at Ruby exit when copying nodes between documents,
9
+ and using node sets, sample trace in node_set_bug.txt
10
+ * XML::Attr.name gives [BUG] segfault line.
11
+
12
+ * Some C funcs need more NULL checking, they're throwing wierd
13
+ ArgumentErrors into RubyLand. See TODOs in source.
14
+
15
+ * Get libxml to compile and build with OS-X.
16
+
17
+ ==== ENHANCEMENTS
18
+
19
+ * Add warnings to each of the xpath functions if xpath isn't compiled
20
+ in.
21
+
22
+ * Flush out XML::XPath::Context to more closely mirror the
23
+ _xmlXPathContext(libxml/xpath.h) structure.
24
+
25
+ * Add XML::Node#sibling= to add siblings to an XML document
26
+
27
+ * Cleanup the variable naming schemes and standardize on one. Ideas:
28
+
29
+ * All VALUE encapsulated objects are prefixed with the character
30
+ 'r'. rnode, rdoc, rctxt, rxpath, rxnset, rxns.
31
+
32
+ * Their unwrapped C equiv drops the 'r'. Since operating with
33
+ libxml isn't context less, this should help catch the cases
34
+ where having routines that are libxml derived (ex: xmlNodePtr)
35
+ and ruby-libxml derived (ex: ruby_xml_node) should collide in
36
+ the same name space convention. This will act as a reminder
37
+ and deterrant against haphazardly returning and using libxml
38
+ objects when they should be passed in. ruby-libxml is a set
39
+ of tools, not and end result. Put the power and options in
40
+ the hands of the user and don't confine or constrain anything
41
+ within reason. Just because someone can't think of a use for
42
+ it doesn't mean it's not possible or useful to someone. It's
43
+ the weird shit that makes a library powerful.
44
+
45
+ rnode -> node
46
+ rdoc -> doc
47
+ rctxt -> ctxt
48
+ rxpath -> xpath
49
+
50
+ * Should sweep through the code and remove all instances of
51
+ 'return(Qnil)' with exceptions if 'return(Qnil)' is being used for
52
+ signaling an error or inability to process the document.
53
+
54
+ * Pointer target signedness warnings (GCC 4.0)
55
+
56
+ * Need to add the ability to create namespace objects and modify them
57
+ accordingly.
58
+
59
+ * Need to figure out how to easily apply a namespace object to either a
60
+ document or a node.
61
+
62
+ * Add an XML::DTD class.
63
+
64
+ * Add ability to dynamically create DTD's.
65
+
66
+ * Add ability to set auto-parse on XML::Parser classes.
67
+
68
+ * Add ability to set auto-set on XML::XPath classes.
69
+
70
+ * What's the counter part to XML::Node#sibling= ? XML::Node#next ??
71
+ There's a certain degree of othogonality that I'm missing in the API
72
+ at the moment and it's picking away at my brain like a bad Dan Quale
73
+ quote.
74
+
75
+ * Add a way of inspecting an XML::Node so that it can be serialized.
76
+
77
+ * Have XML::Node#child= accept ChildNodeLists.
78
+
79
+ * Add ability to append hashes and arrays via the XML::Node#<< method.
80
+
81
+ ==== Data Serialization
82
+
83
+ * Need to define DTD for basic ruby types that have been XML serialized
84
+ and deserialized.