[Erledigt] HTML parsen: option-Values auslesen und selected option finden

Hallo!

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…]

Gruß,
pcworld

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.

Ansonsten: http://htmlparser.sourceforge.net/ Das kommt wohl auch mit nicht XHTML aus.

Gut Schuß
VuuRWerK :wink:

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");

erhalten.

@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.

Gut Schuß
VuuRWerK :wink:

LOL hab das parsen übersehn ^^ ah ok das erklärt die Frage nach der Library - ok ich nehm alles zurück und behaupts Gegenteil :smiley:

Ich hab immer JDom benutzt damit kann man super Sachen zerlegen, aber halt immer die Vorraussetzung das es gültiges XML ist.

Danke!

Werde mir mal JDOM anschauen, sieht gar nicht so schlecht aus.

Das Dokument enthält zwar Fehler, aber ich denke nicht, dass sie JDOM stören werden.

Gruß,
pcworld

Och doch das stört es ggf. schon :slight_smile:
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.

Gut Schuß
VuuRWerK :wink:

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]

…ultgallery.change.php" method="post">**S**tandardgalerie: <select name="default" 

Versteh ich nicht :slight_smile:
[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… :smiley:
[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.

Gruß,
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

Ich probier mal den HTMLParser von http://htmlparser.sourceforge.net/ aus.

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? :wink:

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?

Gut Schuß
VuuRWerK :wink:

[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 ;)

Bevor ich vergesse, meine Lösung zu zeigen ;-):

Also ich bin das Ganze mit dem Parser von http://www.htmlparser.org/ angegangen, der ist nicht so streng… :slight_smile:

		Parser parser = new Parser();
		parser.setInputHTML("HTML-Code...");
		Node[] optionList = (Node[]) parser.extractAllNodesThatMatch(
				new NodeFilter() {

					public boolean accept(Node node) {
						if (node instanceof OptionTag) {
							return true;
						}
						return false;
					}
				}).toNodeArray();

		for (Node node : optionList) {
			OptionTag option = (OptionTag) node;
			System.out.print("Text: " + option.getOptionText()
					+ "
 Value: " + option.getValue());
			if (option.getAttribute("selected") != null) {
				System.out.print(" - ist selected");
			}
			System.out.println();
		}```

Gruß,
pcworld