Avatar billede kasseper Nybegynder
23. juli 2003 - 11:49 Der er 12 kommentarer og
1 løsning

xerces : TreeWalker forklaring

Hej så

Jeg kan ikke helt forstå TreeWalker interfacet :

parameter 2 og 3, er sq da modstridende !!!!

<snip src="http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeFilter">

whatToShow of type unsigned long, readonly
This attribute determines which node types are presented via the iterator. The available set of constants is defined in the NodeFilter interface. Nodes not accepted by whatToShow will be skipped, but their children may still be considered. Note that this skip takes precedence over the filter, if any.

</snip>

Altså hvis jeg skal bruge en TreeWalker som ignorer comments, så laver jeg et NodeFilter som rejecter comment nodes og accepter alle andre, men hvis 'whattoshow' parameteren har precedens over dette nodefilter, hvad i alverden gør jeg så ????
Jeg kan jo ikke sætte whattoshow til alle nodes pånær  comments !!!

Man er jo meget berænset af whattoshow parameteren...!
Avatar billede kasseper Nybegynder
23. juli 2003 - 11:52 #1
og den kan iøvrigt ikke sættes til null....!
Avatar billede arne_v Ekspert
23. juli 2003 - 13:09 #2
Nu har jeg kun brugt meget kort tid på at læse det link
du angav (og jeg kendte ikke dette i forvejen).

Men hvorfor ikke sætte whattoshow til SHOW_ALL & ~SHOW_COMMENT ?
Avatar billede kasseper Nybegynder
23. juli 2003 - 13:21 #3
Øhhh tilde ?
hvad betyder den ~ du angiver, er det en negering ?
Avatar billede arne_v Ekspert
23. juli 2003 - 13:23 #4
~ vender all bits, så ~SHOW_COMMENT skulle være alle bit undtagen SHOW_COMMENT.
Avatar billede kasseper Nybegynder
23. juli 2003 - 14:00 #5
Det virker ikke :(
Avatar billede arne_v Ekspert
23. juli 2003 - 14:01 #6
OK.

Jeg kan evt. selv prøve at lave lidt kode.

Men det bliver først senere idag.

Måske er der andre som har erfaring med.
Avatar billede kasseper Nybegynder
23. juli 2003 - 15:27 #7
super...!
Avatar billede arne_v Ekspert
23. juli 2003 - 17:53 #8
Følgende virker hos mig:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

public class Walker {
  private final static String XML_FILE = "C:\\walktest.xml";
  public static void main(String[] args) {
      writeXml(XML_FILE);
      readXml(XML_FILE);
  }
  private static void writeXml(String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<list>");
        pw.println("<!-- first element -->");
        pw.println("<element>element 1</element>");
        pw.println("<!-- second element -->");
        pw.println("<element>element 2</element>");
        pw.println("</list>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static void readXml(String filename) {
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        // oldfashioned way
        NodeList elements = doc.getElementsByTagName("element");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            System.out.println(element.getFirstChild().getNodeValue());
        }
        System.out.println("----------");
        // walk everything
        TreeWalker walk1 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL, null, false);
        Node n1;
        while((n1 = walk1.nextNode()) != null) {
            int type = n1.getNodeType();
            String name = n1.getNodeName();
            String value = n1.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
        System.out.println("----------");
        // walk everything but comments
        TreeWalker walk2 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_COMMENT, null, false);
        Node n2;
        while((n2 = walk2.nextNode()) != null) {
            int type = n2.getNodeType();
            String name = n2.getNodeName();
            String value = n2.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}
Avatar billede arne_v Ekspert
23. juli 2003 - 17:53 #9
Output:

element 1
element 2
----------
3 #text 
8 #comment  first element
3 #text 
1 element
3 #text element 1
3 #text 
8 #comment  second element
3 #text 
1 element
3 #text element 2
3 #text 
----------
3 #text 
3 #text 
1 element
3 #text element 1
3 #text 
3 #text 
1 element
3 #text element 2
3 #text
Avatar billede arne_v Ekspert
23. juli 2003 - 17:53 #10
Kommentarerne er fint fjernet.
Avatar billede arne_v Ekspert
23. juli 2003 - 18:03 #11
Udbygget med et filter:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

public class Walker {
  private final static String XML_FILE = "C:\\walktest.xml";
  public static void main(String[] args) {
      writeXml(XML_FILE);
      readXml(XML_FILE);
  }
  private static void writeXml(String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<list>");
        pw.println("<!-- first element -->");
        pw.println("<element>element 1</element>");
        pw.println("<!-- second element -->");
        pw.println("<element>element 2</element>");
        pw.println("</list>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static void readXml(String filename) {
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        // oldfashioned way
        NodeList elements = doc.getElementsByTagName("element");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            System.out.println(element.getFirstChild().getNodeValue());
        }
        System.out.println("----------");
        // walk everything
        TreeWalker walk1 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL, null, false);
        Node n1;
        while((n1 = walk1.nextNode()) != null) {
            int type = n1.getNodeType();
            String name = n1.getNodeName();
            String value = n1.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
        System.out.println("----------");
        // walk everything but comments
        TreeWalker walk2 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_COMMENT, null, false);
        Node n2;
        while((n2 = walk2.nextNode()) != null) {
            int type = n2.getNodeType();
            String name = n2.getNodeName();
            String value = n2.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
        System.out.println("----------");
        // walk all text that are child to element
        TreeWalker walk3 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_TEXT, new Filter(), false);
        Node n3;
        while((n3 = walk3.nextNode()) != null) {
            int type = n3.getNodeType();
            String name = n3.getNodeName();
            String value = n3.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

class Filter implements NodeFilter {
    public short acceptNode(Node node) {
        if(node.getNodeType() == Node.TEXT_NODE &&
          node.getParentNode().getNodeType() == Node.ELEMENT_NODE &&
          node.getParentNode().getNodeName().equals("element")) {
              return NodeFilter.FILTER_ACCEPT;
          } else {
              return NodeFilter.FILTER_REJECT;
          }
    }
}

output:

element 1
element 2
----------
3 #text 
8 #comment  first element
3 #text 
1 element
3 #text element 1
3 #text 
8 #comment  second element
3 #text 
1 element
3 #text element 2
3 #text 
----------
3 #text 
3 #text 
1 element
3 #text element 1
3 #text 
3 #text 
1 element
3 #text element 2
3 #text 
----------
3 #text element 1
3 #text element 2
Avatar billede arne_v Ekspert
23. juli 2003 - 18:04 #12
Og et svar.
Avatar billede kasseper Nybegynder
29. juli 2003 - 10:08 #13
Ja tak, det virkede, jeg ved ikke hvorfor at det ikke spillede da jeg prøvede...:)
Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester