Title: Message
Hi,
There seems to be an assumption that a visitor cannot modify the structure built into the code into AbstractElement.accept(Visitor)
the length of the attributes and the content is cached so that if the visitor modifies the content then NPE can occur, or nodes can be missed
 
Is there something in the visitor pattern that means that the visitor cannot make changes (None that I am aware of)
 
This is from the postings on the user newsgroug under 'Removing Nodes'
 
------------------------------------

Hi,

The first method fails because there is a bug in the AbstractElement.accept(Visitor) method

IMHO accept should not assume that the visitor will not change the structure of the element, and it caches the element & attribute counts for performmance.

Is there any reason why a visitor should not modify the content?. I will start a separate post regarding this

The second method failes because you are attempting to remove the node from the document, not the parent node.

If you use

n.getParent().remove(n),

or better still

n.detach()

Then it works

 

> -----Original Message-----

> From: [EMAIL PROTECTED]

> [mailto:[EMAIL PROTECTED]] On Behalf Of

> [EMAIL PROTECTED]

> Sent: Wednesday 16 June 2004 13:57

> To: [EMAIL PROTECTED]

> Subject: [dom4j-user] Removing Nodes

>

>

> Hi!

>

> I try to remove all <DIV>s from a Document but this seems to

> be somewhat

> tricky :-) I'd prefer to use a Visitor; the code below throws an

> NullPointerException. The second approach simply doesn't work:

>

> import java.io.FileReader;

> import java.util.List;

> import java.util.Iterator;

>

> import org.cyberneko.html.parsers.SAXParser;

> import org.dom4j.Document;

> import org.dom4j.Element;

> import org.dom4j.Node;

> import org.dom4j.VisitorSupport;

> import org.dom4j.io.SAXReader;

>

> public class Test

> {

> static class KillDivs extends VisitorSupport

> {

> public void visit( Element e )

> {

> if (e.getName().equalsIgnoreCase("div"))

> {

> e.getParent().remove(e);

> return;

> }

> }

> }

>

> public static void main(String[] args)

> {

> try

> {

> SAXReader reader = new SAXReader(new

> SAXParser());

> Document doc = reader.read(new

> FileReader("test.html"));

> // doc.accept(new KillDivs());

> List divs = doc.selectNodes("//DIV");

> for (Iterator<Node> iter =

> divs.iterator(); iter.hasNext(); )

> {

> Node n = iter.next();

> if(n.getName().equalsIgnoreCase("div"))

> {

> doc.remove(n);

> }

> }

> String s = doc.asXML();

> System.out.println(s.indexOf("<DIV>"));

> }

> catch (Exception e)

> {

> System.err.println("->"+e);

> }

> }

>

> }

>

>

> -------------------------------------------------------

> This SF.Net email is sponsored by The 2004 JavaOne(SM) Conference

> Learn from the experts at JavaOne(SM), Sun's Worldwide Java Developer

> Conference, June 28 - July 1 at the Moscone Center in San

> Francisco, CA

> REGISTER AND SAVE! http://java.sun.com/javaone/sf Priority

> Code NWMGYKND

> _______________________________________________

> dom4j-user mailing list

> [EMAIL PROTECTED]

> https://lists.sourceforge.net/lists/listinfo/dom4j-user

>

Reply via email to