xml Jdom Auslesen

Conners

Erfahrenes Mitglied
Huhu nochmal,

ich lese aus einer XML-Datei Informationen aus, indem ich ein bestimmtes Tag ("tagname") suche, dieses mit einem string ("number") vergleiche und von da aus zum Parent-Node springe und von mir verlangte informationen ("tag") returne.
Das sieht in etwa so aus: (Falls das programmiertechnisch schlecht ist, dürft ihr das gerne kritisieren :) )

Code:
NodeList nlist = doc.getElementsByTagName(tagname);
for (int i = 0; i < nlist.getLength(); i++) 
{
	if (nlist.item(i).getFirstChild().getNodeValue().equals(number))
	{
		NodeList nlist2 = nlist.item(i).getParentNode().getChildNodes();

		for (int j = 0; j < nlist2.getLength(); j++) 
		{
			if (nlist2.item(j).getNodeName()==tag)
				return (nlist2.item(j).getTextContent());
		}

	}
}

In meiner xml-Datei stehen allerdings in jeder <entry> noch ne id-number drin, die ich auch gern haben würde. Ich hab schon n bischen rumprogrammiert, aber ich komm da nicht ran. Bitte kann mir einer helfen
xml sieht in etwa so aus:

Code:
<entry id="5974305843">
      <vname>August</vname>
      <nname>Muster</nname>
      <nr>472384</nr>
      ....
</entry>

EDIT: Kann das sein, dass ich durch den Aufruf von ".getParentNode().getChildNodes();" nur noch an den Inhalt von dem Entry rankomme und nicht mehr an den Entry-Tag selber?
 
Zuletzt bearbeitet:
Du solltest dich mit XPath beschäftigen. Damit kannst du Knoten nach der gewünschten Achse sowie nach Tests auswählen kannst.

Ein kurzes Beispiel, die auszulesende Datei sieht wie folgt aus:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<entries>
      <entry id="5974305843">
            <vname>August</vname>
            <nname>Muster</nname>
            <nr>472384</nr>
      </entry>
      <entry id="5974783843">
            <vname>Markus</vname>
            <nname>Meier</nname>
            <nr>477834</nr>
      </entry>
      <entry id="5974783839">
            <vname>Chistian</vname>
            <nname>Meier</nname>
            <nr>477897</nr>
      </entry>
<entries>

Im Beispiel suche ich alle Meier Einträge. In XPath würde das dann wie folgt aussehen:

Code:
/entries/entry[nname/text() == 'Meier']

und würde eine NodeList von allen entry Nodes zurückgeben, welche in einem Kindknoten namens 'nname' den Textwert 'Meier' haben.

Java:
List<Element> assets = XPath.selectNodes(this.docTree, "/entries/entry[nname/text() == 'Meier']");

Von diesen einzelnen Nodes kannst du dann auch wieder per XPath die einzelnen Werte auszulesen. Als Beispiel geb ich hier den vname und den nr Node auf dem stdout aus.

Java:
List<Element> entries = XPath.selectNodes(this.docTree, "/entries/entry[nname/text() == 'Meier']");

XPath xPathVName = XPath.newInstance("nname/text()");
XPath xPathNR = XPath.newInstance("nr/text()");

for(Element entry : entries) {
      System.out.println(xPathVName.valueOf(entry));
      System.out.println(xPathNR.valueOf(entry));
}

Für weitere Details bezüglich XPath und JDOM in Kombination mit XPath ist wie immer :google: zu konsultieren.
 
Zuletzt bearbeitet von einem Moderator:
Ich krieg da ne Fehlermeldung:

org.jdom.JDOMException: Invalid XPath expression: "/entries/entry[hm/text() == number]": Unexpected '='

Gruß
Conners
 
Zuletzt bearbeitet:
Hallo

Wieso klappt das:

List<Element> ergebnis = XPath.selectNodes( doc, "/entries/entry[ln/text() = 'Meier']" );

aber das nicht:

String name = "Meier";
List<Element> ergebnis = XPath.selectNodes( doc, "/entries/entry[ln/text() = name]" );



Wenn das irgendwie gehen würde, wär ich mega zufrieden :)

Gruß
Conners
 
Ich hab da nochmal ein wenig rumprobiert, und bin auf ein für mich merkwürdiges Problem gestoßen.

Ich hab versucht mein Problem mit der boolean funtion contain() zu lösen.

Auch jetzt interessiert mich wieder; wieso klappt dieses hier:

Code:
List<Element> ergebnis = XPath.selectNodes( doc, "/entries/entry[contains(hm/text(),'023156738')" );

aber das hier nicht:

Code:
//String number = "023156738";
String number = "'023156738'";
List<Element> ergebnis = XPath.selectNodes( doc, "/entries/entry[contains(hm/text(), number)" );

Ich hab irgendwie das Gefühl, ich versteh allgemein nen Stringvergleich noch nicht.
Und by the way, wieso muss dort der String in einfachen Hochkommas gesetzt werden?

Ich hoffe jemand kann mir dies wahrscheinlich mega einfaches Problem eben erläutern :-).

Gruß Conners
 
Java ist kein PHP

Code:
String number = "023156738";
List<Element> ergebnis = XPath.selectNodes( doc, "/entries/entry[contains(hm/text(), '" + number + "')" );
 
ok es klappt, aber ich versteh noch nicht so ganz, was du da gemacht hast.

durch String number ist meiner Meinung nach schon ein string gegeben, wieso muss dann um ' number ' nochmal Anführungszeichen?

und was genau bewirken die +´s ?

sry wenn ich frag.
 
Zurück