PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java/jdom: XML Baum nach Element durchsuchen um Wert zu erhalten


mobius
2008-10-30, 16:45:19
Hi Leute,

ich bekomm es nicht hin einen mit jdom erstellten (aber unbekannten) XML Baum nach einem speziellen Element zu durchsuchen, um dessen Wert zu bekommen.
Wie das funktionieren soll wenn ich die Struktur nicht kenne ,will mir nicht in den Sinn kommen. Hab mir schon alles mögliche wegen getChild und Listen von direkten Kindern angesehen, aber ich komm auf keinen Nenner. Passendes Tutorial finde ich auch keins.


<DOCUMENT>
<bla1>
<bla2>
...
<Mathe>5</Mathe>
...
</DOCUMENT>

Ich will eine solche Methode:
Wert = searchXMLValue("Mathe");

Wie tief der Baum ist oder ob dieser mehrere Elemente mit dem selben Namen enthält bleibt offen.

Kann mir Jemand auf die Sprünge helfen?

Shink
2008-10-30, 18:05:41
Hi Leute,

ich bekomm es nicht hin einen mit jdom erstellten (aber unbekannten) XML Baum nach einem speziellen Element zu durchsuchen, um dessen Wert zu bekommen.
Wie das funktionieren soll wenn ich die Struktur nicht kenne ,will mir nicht in den Sinn kommen.
Hmm... in so einem Fall nimmt man ja normalerweise eher SAX her.

Ansonsten: Was spricht gegen eine rekursive Funktion die auf die Wurzel getChildren() anruft, alle Elemente die zurückkommen auf den gesuchten Namen überprüft und wenn nichts gefunden wird sich selbst auf alle Elemente anwendet?

mobius
2008-10-30, 18:34:22
Hmm... in so einem Fall nimmt man ja normalerweise eher SAX her.

Dürfte nicht das Problem sein, hab halt nur die Baumerstellung mit jdom angefangen. Wenns mit SAX besser geht, nehm ich auch das.

Ansonsten: Was spricht gegen eine rekursive Funktion die auf die Wurzel getChildren() anruft, alle Elemente die zurückkommen auf den gesuchten Namen überprüft und wenn nichts gefunden wird sich selbst auf alle Elemente anwendet?

Den Ansatz hab ich auch mal versucht, bin aber kläglich gescheitert weil ich mich hoffnungslos verbaut habe. Rekursion ist nicht gerade meine Stärke. Ein Beispiel würde mir da sehr helfen.

Shink
2008-10-30, 19:59:37
SAX ist sinnvoll wenn man den Inhalt der XML nicht wirklich kennt und außerdem performanter. Aber auch sehr kompliziert im Standardfall.

Ein ungetesteter Vorschlag aus dem Hüftgelenk:


static String searchXMLValue(String toSearch, Element anElement) {
if (anElement.getName().equals(toSearch)) {
return anElement.getText();
}
for (Iterator it=anElement.getChildren();it.hasNext();) {
Element child=(Element)it.next();
String search=searchXMLValue(toSearch, child);
if (search!=null) {
return search;
}
}
return null;
}

Achill
2008-10-30, 22:16:25
Wenn nicht max. Geschwindigkeit & min. Speicherverbrauch das Ziel ist, wie wäre es mit XPath?


XPath xpath = XPathFactory.newInstance().newXPath();
NodeList test = (NodeList) xpath.evaluate("//toSearch", element, XPathConstants.NODESET);


bzw. wenn man mehrmals such will ...


XPathExpression expr = xpath.compile("//toSearch");
NodeList test = (NodeList) xpath.evaluate(element, XPathConstants.NODESET);


... und dann muss man sich nur noch etwas mit der XPath-Syntax auseinander setzen :)

Als weitere Einführung:
http://www.ibm.com/developerworks/library/x-javaxpathapi.html

Noch ein Hinweis: Die XPath Implementierung in Java6 ist nicht Thread-Save, mit kompilierten XPathExpression kann man sich leicht Seiteneffekte einhandeln.