[libxml-devel] Proposed API changes for working with child nodes and attributes

Sean Chittenden sean at chittenden.org
Tue Jul 8 12:51:58 EDT 2008


> 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
sean at chittenden.org





More information about the libxml-devel mailing list