I've noticed two oddities in the libxml api - dealing with child
elements and attributes. In both cases, the returned value is a
single item (an attribute or node) that then provides methods to get
to the next item.
So:
some_node = doc.find('/foo')
child = some_node.children
while child
... do stuff
child = child.next
end
There is also a bit of ruby syntactic sugar that defines an each
method, so you can do:
some_node = doc.find('/foo')
some_node.children.each do |node|
... do stuff
end
Thus node.children is a XML::Node that acts both as a single node
and also a collection. The same is true for attributes.
I wanted to revisit this at some point, I'm glad someone is doing it.
For anyone who works with the DOM's built into browsers, or follows
the W3C standards (\http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html)
, this is a bit weird and non-intuitive.
I'd prefer that node.children becomes node.first and node.children
returns an array of child nodes. We'd then add an each_child method
to XML::Node (based on node.first and node.next) for quick and easy
iteration.
some_node = doc.find('/foo')
child_nodes = some_node.children
child_nodes.class == "Array"
some_node.each_child do |node|
... do stuff
end
I think if you go back to the original code from ~0.1, it had an
interface like: doc.find('/foo').each {|node| p node } which was
convenient in some situations. In general, I dislike most of the DOM
interfaces available.
find() should return a set of nodes (I think that's what it does,
actually) and the nodeset behaves like the union of a node and an
array. Chaining methods together needlessly to support a DOM
interface of lists and atoms is a bit clunky and was something I
attempted to avoid.
At this point, "*shrug* whatever." I think the API for a developer
should mask some of the libxml structure of nodesets/nodes because,
frankly, it's a pain in the ass. Constantly coding around, "are you a
list or a node?" is inefficient and that's largely the value of Ruby -
efficiency of programming.
...I wonder if I still have my patch hanging around for that makes use
of method_missing() to find nodes (pretty cool for XML configuration
foo).
And for attributes, I vote that libxml copies REXML's interface:
http://www.germane-software.com/software/rexml/doc/classes/REXML/Attributes.html
Thoughts?
Go for it - attribute support sucked hard. -sc
--
Sean Chittenden
[EMAIL PROTECTED]
_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel