Problem mit dom4j und jaxen

Unicate

Erfahrenes Mitglied
Hallo alle zusammen!

Ich möchte mit dom4j und jaxen eine html parsen.
hier meine html:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
	<head>
		<meta content="test" />
	</head>

	<body>
		<div>So ne ********</div>
	</body>
</html>

und von dieser möchte ich gern den inhalt des div-tags haben, also dacht ich so:

Java:
SAXReader reader = new SAXReader();
		// weil der parser sonst exceptions wirft
		reader.setValidation(false);
		reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
		// xml laden
		Document doc = reader.read(new File("test.html"));
		
		@SuppressWarnings("unchecked")
		// das hier geht nicht
		List<Element> list = doc.selectNodes("//div");
		// das einzige was geht ist "//html"
		// im debugger ist die liste an dieser stelle leer
		for(Element e : list) {
			System.out.println(e.toString());
		}

Wenn ich das selbe versuche mit XPather zu machen geht das sehr gut.

Wo ist das Problem?
 
Nach nun mehreren Stunden suchen habe ich den "Fehler" gefunden.
Problem hier war, das der xml namespace für das Dokument gesetzt wurde.

Hier die Lösung:
Nach dem Element mit angehangenem Namespace fragen.
Im obigen Beispiel wäre das "//xhtml:div". Nun wird der Parser sagen, das dieses Element keinen gebundenen Namespace hat. (XPath expression uses unbound namespace prefix xhtml)
Deswegen geben wir ihm diesen.
Java:
SAXReader reader = new SAXReader();
reader.setValidation(false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document doc = reader.read(new File("test.xml"));		
Dom4jXPath p = new Dom4jXPath("//xhtml:div");
HashMap<String, String> map = new HashMap<String, String>();
map.put("xhtml", "http://www.w3.org/1999/xhtml");
p.setNamespaceContext(new SimpleNamespaceContext(map));
List<Element> list = p.selectNodes(doc);
for(Element e : list) {
	System.out.println(e.asXML());
}
 
Zurück