# Probleme mit XPath bei Java



## Monsterbacke (26. Aug 2010)

Hallo!
Ich habe folgendes Problem beim Auslesen einer XML-Datei aus Java mittels XPath. Ich habe eine XML-Datei, die ungefähr so aussieht:

```
<kunde nr="100">
	
		<name>
			<anrede>Herr</anrede>
			<vorname>Hans</vorname>
                        <vorname>Peter</vorname>
			<nachname>Lustig</nachname>
		</name>
</kunde>
```
Das blöde ist jetzt, dass manche Kunden nur einen Vornamen haben und andere zwei. Durch die XPath Abfrage "/kunde//vorname/text()" werden mir in Java jetzt aber "Hans" und "Peter" als zwei getrennte Vornamen ausgegeben, also quasi von zwei verschiedenen Leuten. Ich lasse mir nämlich später die ganzen Vornamen in einer Liste speichern, d.h. es sollte so sein, dass "Hans Peter" ein String ist und nicht zwei getrennte. Kann ich die XPath Abfrage irgendwie so verändern, dass mein Vorhaben funktioniert?


----------



## sylo (26. Aug 2010)

Hi

mein Vorschlag wäre, nicht nach dem Text zu suchen, sondern nach dem Knoten Vornamen /kunde//vorname. hier bekommst du dann eine Liste von Vornamen und diese kannst du dann, bevor du sie speicherst, zusammensetzten.

Grüße
sylo


----------



## Monsterbacke (26. Aug 2010)

Wie meinst du das mit dem Zusammensetzen? Wie funktioniert das bzw. wie finde ich überhaupt heraus, ob zwei Vornamen zu demselben Namen gehören?


----------



## sylo (26. Aug 2010)

HI

also wenn ich einen Xpath ausdruck brauche mache ich sowas:

```
XPathExpression expr = xpath.compile(/kunde//vorname);
Object result = expr.evaluate(xmldocument, XPathConstants.NODESET);

Nodes nodes = (NodeList) result;
```

Jetzt hast du eine Liste von Knoten, die nur aus vorname bestehen sollte. Dann kannst du ne Schleife bauen in der du die Liste durchgehst und alle Text-Werte der Vornamen zusammensetzt und diese dann abspeicherst.

Mir fällt aber gerade auf dass du wohl eine Lösung wolltest, mit der man direkt mit dem XPath Ausdruck diesen zusammengesetzten String bekommt. Ist das Richtig?
Wenn ja weiß ich da leider keine Antwort drauf. Aber so wie oben erklärt sollte es funktionieren.

Grüße
sylo


----------



## Monsterbacke (26. Aug 2010)

Wenn das nicht als XPath Ausdruck geht, ist das nicht so schlimm.
Aber mein Java-Code sieht eigentlich auch so aus wie deiner. Nur statt "Nodes" meinst du wahrscheinlich "NodeList", oder? Sonst würde der Cast auch keinen Sinn ergeben.
Aber ich sehe gerade irgendwie immer noch nicht, wie das mein Problem lösen kann. Wenn ich zwei Kunden hätte, wobei einer "Hans Peter" heißt und der andere "Klaus", dann würde die Liste ja aus drei Knoten bestehen, nämlich "Hans", "Peter", "Klaus". Wie finde ich denn nun heraus, dass "Hans Peter" zusammengehört?


----------



## sylo (26. Aug 2010)

Hi



> Nur statt "Nodes" meinst du wahrscheinlich "NodeList", oder? Sonst würde der Cast auch keinen Sinn ergeben.


Sorry. meinte natürlich NodeList

Ok. verstehe dein Problem. Ich denke dann musst du ein Schritt zurück und mit dem Xpath die Kunden ermitteln. und dann die Liste Knoten für Knoten durchgehen und dann den String zusammensetzen.

also sowas in die Richtung:

```
XPathExpression expr = xpath.compile(//kunde);
Object result = expr.evaluate(xmldocument, XPathConstants.NODESET);
 
NodesList nodes = (NodeList) result;

for(int i=0; i < nodes.getLength(); i++){
   NodeList childOfKunde = nodes.item(i).getChildNodes();
   for (int j = 0; j < childOfKunde.getLength(); j++){
      if(childOfKunde.item(j).getNodeName.equals("vorname")){
         //Hier im string speichern
      }
   }
}
```

Irgendwie habe ich das gefühl dass es wohl eine bessere Lösung gibt. 
Aber fällt mir auf die schnelle nur das ein.

Grüße
sylo


----------

