Do NodeIterator or TreeWalker not do what you want?
Gareth
On Mon, 19 Mar 2001, Peter Meyer wrote:
> Hello DOM-World,
> After working for a while with DOM2 and looking over the spec of DOM3, it
> still seems that there is no way to perform a truly object-oriented
> traversal of a DOM tree. Using the existing model, I can not see a way to
> traverse the DOM without actually using a switch statement based on node
> type.
>
> This seems to me a fairly non-scalable, hard-to-maintain and inelegant way
> to traverse a tree of objects. I am sure it has been considered by the W3C
> to add the ability to use a visitor pattern or a similar object oriented
> design pattern for traversal to the node interface. I would like to
> understand why it has been decided against such an addition.
>
> Given that the DOM is also used in many XML applications, the ommission of a
> good object oriented mechanism is particularly problematic.
>
> In such an application it is likely that a class factory is used to create
> particular subclasses specific for each element type, providing specialized
> functionality for the application actually building the DOM from an XML
> file. Using a switch statement to call specialized functionality on
> traversal is, in my humble opinion, a very unsatisfactory way of action. Yet
> with the current DOM design there seems to be no alternative.
>
> Please consider the addition of a simple visitor pattern interface to the
> node interface. After all, it is an extremely simple addition that can
> safely be ignored by anybody who does not desire to use it, yet permits to
> use the DOM as a primary configurable data structure in a larger scale OO
> application.
>
> Thanks!
> PM
>
>
>
>
>
>
>
> P.S:
> The visitor interface would require:
>
> In the node interface:
> A method
> accept(IVisitor v);
>
> A new interface IVisitor which contains one method:
> execute(Node n);
>
> Implementations:
> In a reference implementation of a class that implements the node if, this
> function would just be like this:
> public void accept(IVisitor v)
> {
> v.execute(this);
> }
> Subclasses of nodes that have children would additionally call
> accept(v);
> for each of their children.
>
> Implementors of the IVisitor interface would implement overrides for execute
> that take as an argument the particular subclass of the node interface they
> are interested in.
> _________________________________________________________________________
> Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.
>
>
--
Gareth Reakes, Lead Software Engineer
DecisionSoft Ltd. http://www.decisionsoft.com
Office: +44 (0) 1865 203192