# Tidy HTML baum durchlaufen



## MQue (27. Mai 2008)

Hallo,

ich hätte nochmal die Frage, da ich das unbedingt brauche:
kann ich irgendwie den private org.w3c.dom.Node tableNode; Node durchlaufen mit einer "einfachen" while oder so in der art:

So lese ich den HTML- Baum ein und erzeuge den Node:


```
node = tidy.parseDOM( in, null);
```

und den Node möchte ich eben dann durchlaufen und manche Texte in dem HTML- File ersetzen,

Wäre euch sehr Dankbar für Hilfe,

lg


----------



## MQue (28. Mai 2008)

ich habe jetzt folgenden Code:


```
NodeIterator it = null;
        try {
            it = parser.elements();        
            while(it.hasMoreNodes()) {
                Node htmlNode = it.nextNode();
                System.out.println("Das ist der Node: " + htmlNode);
                System.out.println("----------------------");                                            
                }
            } catch (ParserException ex) {
            ex.printStackTrace();
        }
```


und ich möchte einfach nur, dass die Struktur des HTML- Baumes durchlaufen wird, aber ich bekomme forlgende Ausgabe unten, der NodeIterator geht also nicht alle Tags nach der Reihe durch (html, head, title, body), sondern er nimmt den html- Node als ganzen Node, Das versteh ich nicht, beim einer XML- Datei mit einem SAXBuilder wird alles schön der Reihe nach durchlaufen,

Hat da jemand eine Lösung oder eine Erklärung, was ich da falsch mache bzw. was da schief läuft???

Vielen Dank, 


```
Das ist der Node: Tag (0[0,0],6[0,6]): html
  Txt (6[0,6],9[1,1]): \n\t
  Tag (9[1,1],15[1,7]): head
    Txt (15[1,7],19[2,2]): \n\t\t
    Tag (19[2,2],91[2,74]): meta http-equiv="content-type" content="text/html; ch...
    Txt (91[2,74],95[3,2]): \n\t\t
    Tag (95[3,2],102[3,9]): title
      Txt (102[3,9],115[3,22]): Meine HomePage
      End (115[3,22],123[3,30]): /title
    Txt (123[3,30],126[4,1]): \n\t
    End (126[4,1],133[4,8]): /head
  Txt (133[4,8],136[5,1]): \n\t
  Tag (136[5,1],175[5,40]): body text="#000000" bgcolor="#FFF00F"
    Txt (175[5,40],184[7,2]): \t\n\t\t\n\t\t
    Tag (184[7,2],203[7,21]): div id="DateAndTime"
      Txt (203[7,21],208[8,3]): \n\t\t\t
      Tag (208[8,3],212[8,7]): ul
        Txt (212[8,7],218[9,4]): \n\t\t\t\t
        Tag (218[9,4],222[9,8]): li
          Txt (222[9,8],236[9,22]): Datum: @Datum@        // ich möchte genau diese Texte, die in @Text@ 
                                                                                  // sind, ersetzten, daher muss ich eben an diese Texte herankommen
          End (236[9,22],241[9,27]): /li
        Txt (241[9,27],249[10,3]): \t\t\t\n\t\t\t
        End (249[10,3],254[10,8]): /ul
      Txt (254[10,8],258[11,2]): \n\t\t
      End (258[11,2],264[11,8]): /div
    Txt (264[11,8],272[13,2]): \n\t\t\n\t\t
  /html

----------------------
Das ist der Node: Txt (6752[211,7],6754[212,0]): \n
----------------------
```


----------



## ARadauer (28. Mai 2008)

schau dir das mal an
http://www.torsten-horn.de/techdocs/java-xml.htm

ungefähr bei der hälfte:
1. DOM-Programmierbeispiel:
XML einlesen und Ergebnis einiger DOM-Node-Abfragemethoden anzeigen

schau mal in der api http://java.sun.com/j2se/1.5.0/docs/api/
unter org.w3c.dom da findet man einiges.
dom ist zwar einwenig gewöhnung bedürftig, aber man kann gut damit arbeiten, wenn man weiß wie ein dom baum aussieht


----------



## MQue (28. Mai 2008)

Ja aber das kanns ja nicht sein, dass es den HTMLParser gibt und der nichtmal die Tags der reihe nach durchlaufen kann, Da brauch ich dann eh keinen Parser wenn das nicht möglich ist,
Hat keiner Erfahrung mit diesem HTML- Parser???


Bin für jeden Tipp dankbar,

PS: wenn ich es mit dem DOM mache, dann muss in der html- Datei ganz oben ja stehen:

<?xml version="1.0" encoding="ISO-8859-1"?>

und das kann ich nicht machen, da ich verschiedene HTML-Seiten so einlesen und bearbeiten möchte, wenn ich die obere Zeile in mein HTML eifüge, gehts natürlich aber ich verwende eben eine reine HTML- Seite (HTML4.01)


----------



## @x.l (28. Mai 2008)

Wenn ich dich richtig verstehe, holst du dir als erstes den HTML-Node, richtig?!

Dann möchtest du alles was darunter hängt durchlaufen, richtig?!

Da du ja vorher nicht weißt, wiviele Elemente drunter hängen und wie tief die Struktur ist, wirst du das ganze Ding rekursiv durchlaufen müssen. Und immer wenn du auf eine "Markierung" triffst (also bei dir @Text@), dann machst du dort eine Ersetzung!


----------



## hama (9. Jul 2009)

Hallo Michael,
ich habe ein Problem mit JTidy, und hoffe, dass Du mir helfen kannst!
ich versuche mit JTidy eine HTML-Datei zu parsen. 
Ich bekomme eigentlich auf den Trace die Ausgabe als XHTML, aber mit folgende Fehlermeldung am Ende!

09.07.2009 16:47:56 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
	at org.w3c.tidy.PPrint.printText(PPrint.java:638)
	at org.w3c.tidy.PPrint.printPI(PPrint.java:1081)
	at org.w3c.tidy.PPrint.printTree(PPrint.java:1284)
	at org.w3c.tidy.PPrint.printTree(PPrint.java:1279)
	at org.w3c.tidy.Tidy.parse(Tidy.java:1294)
	at org.w3c.tidy.Tidy.parse(Tidy.java:1075)
	at org.w3c.tidy.Tidy.parseDOM(Tidy.java:1314)
	at de.in.KomponistenAction.execute(KomponistenAction.java:400)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
....

Also, die Fehlermeldung der Klasse KomponistenAction.java:400 ist wie folgt implementiert:

String str = "hier ist die HTML-Datei";
FileInputStream fin = new FileInputStream(str);

StringWriter errbuf = new StringWriter();
tidy.setErrout(new PrintWriter(errbuf));
ByteArrayOutputStream os = new ByteArrayOutputStream();

org.w3c.dom.Document doc = tidy.parseDOM( fin, os ); // Zeile 400

-------
ich danke Dir für eine posetive Antwort 
Gruß,
Hama


----------

