Habe folgenden HTML-Code, der ungefähr so aussieht:
[XML]
nichts
erstens
zweitens
[/XML]
Was ich machen will:
[ol]
[li]Es soll von allen option-Tags im select-Tag default die Attribute value ausgelesen werden.
[/li][li]Es soll ausgelesen werden, in welchem option-Tag selected=“selected” steht.
[/li][/ol]
Wie gehe ich am besten vor?
[Mit irgendwelchen Libraries, mit indexOf ist das ein bisschen mühsam…]
Wenn es sich bei dem HTML um valides XHTML handelt kannst Du es wie gewohnt als XML behandeln/einlesen und dann bspw. via XPath Dir die selects mit dem namen „default“ heraussuchen. Danach wie gewohnt durch das DOM wandern.
Die Elemente die nicht ausgewählt wurden, also die nicht das selected Attribut haben werden nicht im Formular übertragen. Du müsstest ihre Werte also auf andere Weise übertragen (Bsp.: unsichtbares input Feld).
Die Ausgewählte Option kann man mit: String name = request.getParameter("name");
Bei mehreren Optionen: String[] namen = request.getParameterValues("name");
@Revenant: Ich glaub pcworld liegt eine HTML Datei vor diese er parsen muss und nicht das auslesen von abgesendeten Daten eines Formulars auslesen. So hab ich es zumindestens verstanden.
Och doch das stört es ggf. schon
Wenn es kein valides XHTML ist, ist es somit auch kein valides XML und damit haben, und das ist auch gut so, viele DOM-Libs was dagegen dieses Dokument zu verarbeiten. Wenn Du also die Möglichkeit hast vorher das XHTML zu bearbeiten dann mach es valide und arbeite mit einer DOM-Lib Deines begehrens, ansonsten versuche eine Lib die gewisse Fehler verzeiht (kenn ich aber keine) bzw. versuche das Dokument gegen HTML4 zu validieren, denn dafür gibt es wiederum libs die das verarbeiten können (HTML4 ist nicht so strikt wie XML/XHTML).
Ich weiß aber ehrlich auch nicht ob JDOM da ein wenig „less restrictive“ ist und ein vertretbar fehlerhaftes Dokument verarbeitet, da ich, wenn ich JDOM benutze, meist mit XML oder validem XHTML arbeite.
Naja, sind jetzt nicht unbedingt XML-Fehler, sondern eher HTML-Fehler:
[ul]
[li]8x required attribute „alt“ not specified. [Ist doch sowieso unsinnig, dass jedes Bild ein alt enthält, da es ja auch gleich als Tooltip verwendet wird… :-)]
[/li][li]character data is not allowed here.
[/li]
Versteh ich nicht
[li]document type does not allow element „select“ here; missing one of „ins“, „del“, „h1“, „h2“, „h3“, „h4“, „h5“, „h6“, „p“, „div“, „address“, „fieldset“ start-tag.
[/li][li]document type does not allow element „input“ here; missing one of „ins“, „del“, „h1“, „h2“, „h3“, „h4“, „h5“, „h6“, „p“, „div“, „address“, „fieldset“ start-tag.
[/li][li]Das ist schon eher ein XML-Fehler: end tag for „form“ which is not finished.
[/li]Hab aber im Quellcode die gleiche Anzahl <form …> wie -Tags gefunden…
[li]2x document type does not allow element „hr“ here; missing one of „button“, „map“, „object“, „ins“, „del“, „noscript“ start-tag.
[/li][/ul]
Ich lad mir gleich mal die Lib runter und probiere es aus.
ArrayList<Element> tdTags = (ArrayList<Element>) doc.getRootElement()
.getChild("body")
.getChild("div")
.getChild("table")
.getChild(
"tbody").getChildren("td");
Element selectTag = tdTags.get(1).getChild("div").getChild("div")
.getChild("form").getChild("select");```
Ich bekomme dann aber bei **.getChild("div")** eine NullPointer-Exception. D. h., der **body**-Tag kann nicht gefunden werden.
[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
...
</head>
<body>
...
[/XML]
Hat jemand eine Ahnung, warum?
Gruß,
pcworld
[QUOTE=pcworld]Naja, sind jetzt nicht unbedingt XML-Fehler, sondern eher HTML-Fehler:
[ul]
[li]8x required attribute „alt“ not specified. [Ist doch sowieso unsinnig, dass jedes Bild ein alt enthält, da es ja auch gleich als Tooltip verwendet wird… :-)]
[/li][/QUOTE]
Wie willst Du dann einem Blinden das Bild erklären?
In Form Elementen sind nur Blockelement-Nodes erlaubt keine Text-Nodes. Ein div-tag, besser noch p-tag, hilft da schon weiter.
[QUOTE=pcworld;6441]
[li]document type does not allow element „select“ here; missing one of „ins“, „del“, „h1“, „h2“, „h3“, „h4“, „h5“, „h6“, „p“, „div“, „address“, „fieldset“ start-tag.
[/li][li]document type does not allow element „input“ here; missing one of „ins“, „del“, „h1“, „h2“, „h3“, „h4“, „h5“, „h6“, „p“, „div“, „address“, „fieldset“ start-tag.
[/li][/QUOTE]
Problem wie oben nur das Du hier ein Inlineelement-Node benutzt anstatt eines Text-Nodes, auch hier das Blockelement und alles ist gut
Die Anzahl sagt nix, die Reihenfolge ist hier entscheidend. Wenn Du ein schließendes div beispielsweiße noch vor dem schließenden form hast kommt dieser Fehler.
Wäre interessant an welcher Stelle das auftriit, ich tippe mal auf: mittem im Text?
[QUOTE=pcworld]Hab es mal folgendermaßen probiert:
ArrayList<Element> tdTags = (ArrayList<Element>) doc.getRootElement()
.getChild("body")
.getChild("div")
.getChild("table")
.getChild(
"tbody").getChildren("td");
Element selectTag = tdTags.get(1).getChild("div").getChild("div")
.getChild("form").getChild("select");```
Ich bekomme dann aber bei **.getChild("div")** eine NullPointer-Exception. D. h., der **body**-Tag kann nicht gefunden werden.
[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
...
</head>
<body>
...
[/XML]
Hat jemand eine Ahnung, warum?
Gruß,
pcworld[/QUOTE]
An dieser Stelle würde ich sagen, da es sich hierbei **nicht** um valides XML/XHTML handelt wird diese Probleme haben.
Gut Schuß
VuuRWerK ;)