PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HTML Baum traversieren


SGT.Hawk
2005-09-26, 22:14:23
Ich habe einen HTML Unordered List(<ul>) als String.
Nun würde gerne in Java den Inhalt der Elemente z.B
<ul>
<li>a</li>
<li>b
<ul>
<li> c</li>
</ul>
</li>
</ul>

Das ist nur ein Beispiel.Es soll natürlich immer alle auslesen können, egal welche Verschachtlungstiefe.Nur ich komme auf keine gescheite Lösung, wie man das machen könnte.:(
Irgendwelche Vorschläge?

Senior Sanchez
2005-09-26, 22:18:15
Ich habe einen HTML Unordered List(<ul>) als String.
Nun würde gerne in Java den Inhalt der Elemente z.B
<ul>
<li>a</li>
<li>b
<ul>
<li> c</li>
</ul>
</li>
</ul>

Das ist nur ein Beispiel.Es soll natürlich immer alle auslesen können, egal welche Verschachtlungstiefe.Nur ich komme auf keine gescheite Lösung, wie man das machen könnte.:(
Irgendwelche Vorschläge?


Hmm, erstens scheint das kein HTML Dokument, sondern mehr nen XML-Dokument zu sein (auch wenn etwas fehlt) und zweitens komme ich mit deiner ausdrucksweise net klar, kanns net wirklich nachvollziehen, sry.

bulla
2005-09-26, 22:22:53
rekursiv?
Also am Anfang und Ende jeweils das "ul" und "/ul" bzw. "il" und "/il" auslesen/entfernen und den Zwischenteil einer separaten, für li- bzw. ul-spezifische Sachen optimierten, Methode übergeben?
Ich habe zwar von Html keinen Plan und ob es dafür schon schönere Methoden gibt, aber ich würd wohl diesen Ansatz versuchen..

PatkIllA
2005-09-26, 22:24:25
@senior Sanchez
Das kann auch HTML sein.

@topic
Erstens willst du wahrscheinlich kein Java sondern JavaScript. Die Suchbegriffe die du brauchst sind node und dom.
Du kannst da mal anfangen.
http://de.selfhtml.org/javascript/objekte/node.htm

Captain America
2005-09-26, 22:29:56
Ich habe einen HTML Unordered List(<ul>) als String.
Nun würde gerne in Java den Inhalt der Elemente z.B
<ul>
<li>a</li>
<li>b
<ul>
<li> c</li>
</ul>
</li>
</ul>

Das ist nur ein Beispiel.Es soll natürlich immer alle auslesen können, egal welche Verschachtlungstiefe.Nur ich komme auf keine gescheite Lösung, wie man das machen könnte.:(
Irgendwelche Vorschläge?

wenn ich mich recht erinnere, habe ich das mal vor ewigkeiten auch mal gecodet, dürfte das hier sein:

http://www.informit.com/articles/article.asp?p=31059&redir=1
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/parser/package-summary.html

dabei stellt sich die frage, ob du nur so ein kleines stück html parsen willst, und ob der aufwand lohnt.

alternativ kannst du natürlich auch - sofern der input XML ist - einen XML parser nehmen, und dann mit XPath und simplen schleifen wie Element.getChildNodes() arbeiten.

SGT.Hawk
2005-09-26, 22:31:38
nee,nee,ist schon Java.Hintergrund ist, dass ich aus einer HTML Editor Pane,diese Struktur erkennen muss und dann in einem String einlese, um sie dann in RTF Format auszugeben,das ist aber egal.Mir ist es wichtig erstmal die Daten in eine Struktur zu verpassen,:wink: dass meine MEthode den ANfang und das Ende parst, habe ich schon.Mir fehlt nur noch die Elemente.

SGT.Hawk
2005-09-26, 22:36:26
wenn ich mich recht erinnere, habe ich das mal vor ewigkeiten auch mal gecodet, dürfte das hier sein:

http://www.informit.com/articles/article.asp?p=31059&redir=1
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/text/html/parser/package-summary.html

dabei stellt sich die frage, ob du nur so ein kleines stück html parsen willst, und ob der aufwand lohnt.

alternativ kannst du natürlich auch - sofern der input XML ist - einen XML parser nehmen, und dann mit XPath und simplen schleifen wie Element.getChildNodes() arbeiten.
hmm,fuktioniert, denn das auch,wenn ich nur diesen HTML Abschnitt parse?
Weil ein DTD habe ich ja im HEader nicht.

Captain America
2005-09-26, 22:51:35
hmm,fuktioniert, denn das auch,wenn ich nur diesen HTML Abschnitt parse?
Weil ein DTD habe ich ja im HEader nicht.

ich fürchte das kann ich dir aus der erinnerung nicht beantworten. es müsste so sein, dass du mit einer factory methode einen parser anforderst, und dich nicht ums DTD kümmern musst. steht auf seite 1 von dem informit tutorial.

Senior Sanchez
2005-09-26, 22:56:01
Wusste ich es doch, dass HellHorse mir da auch schonmal geholfen hatte. Was dir helfen könnte ist JTidy.

Zitat von der HP: " JTidy is a Java port of HTML Tidy , a HTML syntax checker and pretty printer. Like its non-Java cousin, JTidy can be used as a tool for cleaning up malformed and faulty HTML. In addition, JTidy provides a DOM interface to the document that is being processed, which effectively makes you able to use JTidy as a DOM parser for real-world HTML."

http://jtidy.sourceforge.net/

SGT.Hawk
2005-09-26, 23:29:50
Danke euch allen.:smile:
Weiter Vorschläge, natürlich happy welcome.
Jtidy hatte ich auch gefunden, ist aber unter vielen Parsern bei mir untergangen und dachte, dass es Overkill wäre.So wird mir aber das denken dann abgenommen, weil mit den APIs abstrahiert wird.:D
@Sanchez
HAt die der Tidy gefallen oder Macken?

Senior Sanchez
2005-09-26, 23:47:43
Danke euch allen.:smile:
Weiter Vorschläge, natürlich happy welcome.
Jtidy hatte ich auch gefunden, ist aber unter vielen Parsern bei mir untergangen und dachte, dass es Overkill wäre.So wird mir aber das denken dann abgenommen, weil mit den APIs abstrahiert wird.:D
@Sanchez
HAt die der Tidy gefallen oder Macken?

Ich habs nie benutzt ;D
Aber ich glaube, das funktioniert schon ganz gut, vllt fragste mal HellHorse, der weiß vllt mehr.

SGT.Hawk
2005-09-27, 10:50:42
Ich habs nie benutzt ;D
Aber ich glaube, das funktioniert schon ganz gut, vllt fragste mal HellHorse, der weiß vllt mehr.
:eek:

Senior Sanchez
2005-09-27, 10:53:27
:eek:

was machste son smily? *g*

SGT.Hawk
2005-09-27, 11:35:15
Wegen ja, nicht benutzt, wird aber gut sein.
Das nenne ich mal ein Argument.:D

Senior Sanchez
2005-09-27, 12:09:31
Wegen ja, nicht benutzt, wird aber gut sein.
Das nenne ich mal ein Argument.:D

Na ansonsten hätte mir das HellHorse bestimmt net empfohlen ;) Obwohl, vllt weiß er es ja auch nur über Hören-Sagen.

HellHorse
2005-09-27, 17:54:09
Obwohl, vllt weiß er es ja auch nur über Hören-Sagen.
So ist es. Allerdings traue ich ihm wesentlich mehr zu als dem HTML Parser von Swing. Hautsächlich für `Ich schreib kein HTML für den Validator sondern für IE/Mozilla/Opera'-Code.

Senior Sanchez
2005-09-27, 18:12:17
So ist es. Allerdings traue ich ihm wesentlich mehr zu als dem HTML Parser von Swing. Hautsächlich für `Ich schreib kein HTML für den Validator sondern für IE/Mozilla/Opera'-Code.

Ich habs nur überflogen, aber erlaubt JTidy auch das parsen und anschließende rendern der URL? Oder muss ich das dann noch manuell machen?

SGT.Hawk
2005-09-27, 19:36:59
Also , ich habe es mal mit dem HTML Parser versucht, aber mit dem bin nicht glücklich geworden.:(
Was der mir der Handler angeboten, war mehr als dürftig.Vielleicht habe ich es auch falsch bedient, aber richtigen Nutzen mit Elementen rausziehen, konnte ich nicht.;(
Tja, villeicht bin ich einfach zu JDOM verwöhnt.
:smile:
@edit Der Jtidy erlaubt nur von Inputstream.Tja leider bringt mir das nichts.Ich brauche für den String einen Reader.Man ist das gemein.

HellHorse
2005-09-27, 20:30:07
@edit Der Jtidy erlaubt nur von Inputstream.Tja leider bringt mir das nichts.Ich brauche für den String einen Reader.Man ist das gemein.
Was ist genau das Problem? Dass du einen String hast und einen InputStream willst?
InputStream is = new ByteArrayInputStream("ein String".getBytes());
Oder willst du einen StringReader (http://java.sun.com/j2se/1.5.0/docs/api/java/io/StringReader.html)?

SGT.Hawk
2005-09-27, 20:49:57
Jo,StringReader. Was soll ich den mit einem ByteArray?:confused:

HellHorse
2005-09-27, 21:36:29
Jo,StringReader. Was soll ich den mit einem ByteArray?:confused:
Wie schon gesagt, ich verstand nicht genau was du wolltest. Hätte ja sein könnten das du einen String hast und einen InputStream darauf willst.

SGT.Hawk
2005-09-27, 21:47:01
Ja,aber mit dem InputStream geht es ja auch.

SGT.Hawk
2005-09-28, 12:25:12
Ich habe jetzt ein andren Lösungsweg eingeschlagen.:cool:
All diese HTML Transformierung zum XML Geschichten war mir zu blöd.
Habe jetzt es mit regulären Ausdrücken versucht.habe jetzt ein Pattern geschrieben, der mir alles Tags als Trennzeichen gibt. String (split)
Jetzt, wo ich die ElementInhalte habe,ist schon mal gut.Nur wie kann ich das mit der Verschachtelung hinbekommen, ich habe ja noch zum Vergleich den alten String.Könnte man dort nicht irgndiwe bis zum Element suchen , um die Tiefe herauszufinden?
@edit
Hat sich erledigt.:up:

Ich fand diese ganzen XML Portierung nach HTML irgedwie nicht gelungen.
Mir ist z.B in JTidy nicht gelungen die Elementwerte herauszufischen.Kann sein, dass DOM da nicht gut funkt.In NekoHTML habe immer eine MalformedException bekommen beim einlesen.:mad:

SGT.Hawk
2005-09-28, 17:50:27
Hmm, doch nicht fertig.....:(
Kann mir schnelle einer sagen wie ich den Anfang und Ende von einem
Unordered List erkenne? In dem String sind eventuelle mehrere Ulists
und normaler Text kann auch sein,deswegen, brauche ich den AnfangIndex und EndIndex der jeweiliger Listen.
Bitte helft mir!;(

Captain America
2005-09-28, 21:35:22
Hmm, doch nicht fertig.....:(
Kann mir schnelle einer sagen wie ich den Anfang und Ende von einem
Unordered List erkenne? In dem String sind eventuelle mehrere Ulists
und normaler Text kann auch sein,deswegen, brauche ich den AnfangIndex und EndIndex der jeweiliger Listen.
Bitte helft mir!;(

bist du sicher, dass du es mit regexp machen willst? imho geht das nicht so einfach, aus einem einfachen grund: wenn es mehrere <ul>s gibt in einem dokument, wird dir eine regexp den anfang des ersten <ul> ausgeben, und das ende des zweiten <ul>, und alles was dazwischen ist. beispiel:


<html>
<head>
<title>TITTENBILDER GRATIS</title>
</head>
<body>
<p>bla bla</p>
<ul>
<li>bla
<ul>
<li>blub</li>
<li>abc</li>
</ul>
</li>
<li>xyz</li>
</ul>
<p>laber schwatz</p>
<ul>
<li>bla
<ul>
<li>blub</li>
<li>abc</li>
</ul>
</li>
<li>xyz</li>
</ul>
</body>
</html>


das lässt sich wenn, nur mit einer relativ grossen regexp auswerten, und auch nur, wenn im <li> kein <p> und andere elemente vorkommen. ist das der fall, dass es innerhalb des <li> AUSSCHLIESSLICH [a-zA-Z0-9\s]* oder ein weiteres <ul> vorkommt?

SGT.Hawk
2005-09-28, 21:48:05
Genau, das war das Problem.:rolleyes:
Egal,jetzt mache ich das nach der Bruteforce Methode.Hilft ja nix, muss morgen fertig habe für die Firma, sonst :uhammer2:
Ich werde einfach alle öffnende <ul> und <li> hochzählen und beim </ul> </li>
einfach runterzählen.Wenn der Counter 0 ist,dann ist das Ende erreicht!=)

Captain America
2005-09-28, 21:53:17
Genau, das war das Problem.:rolleyes:
Egal,jetzt mache ich das nach der Bruteforce Methode.Hilft ja nix, muss morgen fertig habe für die Firma, sonst :uhammer2:
Ich werde einfach alle öffnende <ul> und <li> hochzählen und beim </ul> </li>
einfach runterzählen.Wenn der Counter 0 ist,dann ist das Ende erreicht!=)

:ulol3: warum nich gleich so... viel erfolg und happy coding! :uup:

SGT.Hawk
2005-09-28, 21:55:22
Ja, aber es irgendwie eine BilligLösung und eine peinliche zugleich.
Ganz zu schweigen von der Performance.:D

Captain America
2005-09-28, 22:12:33
Ja, aber es irgendwie eine BilligLösung und eine peinliche zugleich.
Ganz zu schweigen von der Performance.:D

find ich nicht, es ist pragmatisch, es macht was es soll, und andere parser arbeiten im grunde genommen auch so. schauen wo es aufgeht, und wo es zu geht. performance dürfte auch nur ein problem sein, wenn das system sehr lahm oder ausgelastet ist, oder du iterativ sehr viele dokumente bearbeitest.

Senior Sanchez
2005-09-28, 22:49:14
Also ich hätte glaube ich einfach JDOM genommen. Das nutzt nen SAX oder DOMParser und liest glaube ich auch Dokumente ohne Validierung der XML-Struktur an, sprich es müsste nciht mal nen xml-Dokument sein.
Damit wäre es jedenfalls ein leichtes das ganze zu managen.

EDIT: Dann brauchste dieses ganze Element-Rumgefriemel net selber machen, sondern kannst dir von Elementen einfach die Children geben lassen.

http://www.galileocomputing.de/openbook/javainsel4/javainsel_13_003.htm#Rxx365java130030400047C1F030100


Oder übersehe ich jetzt hier irgendwie nen Haken?!?

SGT.Hawk
2005-09-29, 03:58:41
JDOM finde ich auch sehr schön, aber die Sache hat einen Haken. Du musst eine DTD oder Schema anlegen,habe ich versucht, aber immer MalFormdException: no protocol:hä:ucrazy2:
Habe soweit ich das wusste richtig gemacht, aber dannn aufgegeben.

HellHorse
2005-09-29, 09:01:48
Ich werde einfach alle öffnende <ul> und <li> hochzählen und beim </ul> </li>
einfach runterzählen.Wenn der Counter 0 ist,dann ist das Ende erreicht!=)
Du kannst das nur machen, wenn dein Input wohlgeformtes XHTML ist.

JDOM finde ich auch sehr schön, aber die Sache hat einen Haken. Du musst eine DTD oder Schema anlegen,habe ich versucht, aber immer MalFormdException
Kannst ja den HTML DTD verwenden. Der Input muss halt valides, wohlgeformtes XHTML sein.

JTidy funktioniert auch mit HTML und sollte auch mit nicht validem HTML funktionieren.

Ich hoffe du siehtst jetzt was ich und andere gegen `Ich programmiere nicht für den Validator'-Leute habe.

SGT.Hawk
2005-09-29, 10:47:48
Ja,der Input ist XHTML,also wohlgeformt,denn sie komt von HTMLPane von Swing, also klappt das auch glücklicherweise mit dem zählen.:up:
Eine HTML DTD gibt es ja nicht.Das würde zu lange dauern, denn es wird mehrmlas transformiert und übrig bleibt nur ein gewisser Teil des Strings, der zu bearbeiten ist.Ich habe es ja selbst mit DTD Formulierung versucht.
Jtidy habe ich wahrscheinlich falsch bedient.:whistle:
Ich sehe es genauso wie du, validated sollte es schon sein.:wink: