# Attributwert aus XML auslesen



## Cori (27. Jul 2009)

Hallo Zusammen ich hab ein XML, aus dem ich eine einzige ID benötige:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<lab:LabReport>
<lab:report>
<lab:ident>
<lab:referrer_order order_number="1" order_date="2006-03-23T00:00:00" patient_id="1.1" case_id="2"/>
</lab:ident>
</lab:report>
</lab:LabReport>

nun benötige ich die patientenid als long, wie lese ich das am besten aus? Ist XPath da eine lösung?

grüsse cori


----------



## Atze (27. Jul 2009)

simple antwort, ja


----------



## Cori (27. Jul 2009)

Ich habs jetzt mal mit XPath probiert, hab auch die richtige expression zusammen, im java erhalte ich allerdings immer null zurück.

expression: /lab:LabReport/lab:report/lab:ident/lab:referrer_order/@patient_id


----------



## Atze (27. Jul 2009)

bei mir trifft er's und ergibt 1.1


----------



## Cori (27. Jul 2009)

Wen ich die expression im altova xmlspy ausführe funktioniert es ja auch, daher weiss ich das di expression richtig ist. 

Darum hab ich ja geschrieben das ich im Java null erhalte, wen es bei dir geht, dann hab ich irgendwas wohl bei der verwendung des xpath falsch gemacht, nur leider hab ich da keine ahnung, das es so viele verschiedene infos gibt im netz...


----------



## Atze (27. Jul 2009)

```
package org.javaforum;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class PathTest {
	
	public static void main (String[] args){
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true); // never forget this!
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			Document doc = builder.parse("D:\\workspaceFX\\Test\\src\\org\\javaforum\\test.xml");
			
			XPathFactory factoryX = XPathFactory.newInstance();
			XPath xpath = factoryX.newXPath();
			XPathExpression expr = xpath.compile("/LabReport/report/ident/referrer_order/@patient_id ");
			Object result = expr.evaluate(doc, XPathConstants.NODESET);
			NodeList nodes = (NodeList) result;
			for (int i = 0; i < nodes.getLength(); i++) {
			    System.out.println(nodes.item(i).getNodeValue()); 
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}
```

so trifft er bei mir und gibt "1.1" aus. hab aus deinem beispiel nur die namespaces rausgenommen, damits übersichtlicher wird  der rest deiner expression stimmt.


----------



## Cori (27. Jul 2009)

vielen Dank für die Antwort, bei mir jedoch beinhaltet die Nodelist leider keine Elemente...


----------



## Cori (27. Jul 2009)

So nach längerem versuchen geb ichs auf, keine ahnung wieso das es bei mir nie elemente zurückgibt obwohl ich den code von hier kopirt habe...


----------



## SebiB90 (27. Jul 2009)

also ich habs mal getestet, bei mir funktionierts aber nur, wenn namespaceaware false mache.
Zeig nochmal deinen kompletten code und wie genau die xml aufgebaut ist. Denn ein prefix ohne namespace macht irgenwie wenig sinn.


----------



## Cori (27. Jul 2009)

danke vielmals an das hab ich ehrlich nicht gedacht jetzt funktioniert es...
manchmal kann man wirklich blind sein...:lol:


----------



## Sergey (1. Sep 2010)

Hallo, ich habe an dieser Stelle auch ein Problem mit XPath. Ich dachte, dass es an meiner Implementierung lag, aber mit dem Code von "Atze" tritt das Problem bei mir ebenfalls auf.

Also ich bekomme eine XML vom Server generiert. Und muss die Ausgabe validieren. Die XML kann folgendes enthalten:
[XML]<itdOdv type="stop" usage="origin">
<itdOdvPlace state="list" method="itp">
<itdMessage type="error" module="BROKER" code="2">place list</itdMessage>
<odvPlaceElem listIndex="0" selected="0" omc="3241010" placeID="2" value="0:3241010:2" span="9" type="local" matchQuality="993011" mainPlace="0">Brink (Langenhagen)</odvPlaceElem>
<odvPlaceElem listIndex="1" selected="0" omc="13057059" placeID="2" value="1:13057059:2" span="0" type="remote" matchQuality="998007" mainPlace="0">Hankenhagen</odvPlaceElem>
<odvPlaceElem listIndex="2" selected="0" omc="8435030" placeID="2" value="2:8435030:2" span="0" type="remote" matchQuality="998006" mainPlace="1">Langenargen</odvPlaceElem>
<odvPlaceElem listIndex="3" selected="0" omc="3152007" placeID="10" value="3:3152007:10" span="9" type="local" matchQuality="993011" mainPlace="0">Langenhagen (Duder.)</odvPlaceElem>
<odvPlaceElem listIndex="4" selected="0" omc="3357016" placeID="12" value="4:3357016:12" span="9" type="local" matchQuality="991011" mainPlace="0">Langenhagen/Gnarrenb</odvPlaceElem>
<odvPlaceElem listIndex="5" selected="0" omc="3241010" placeID="14" value="5:3241010:14" span="9" type="local" matchQuality="995011" mainPlace="1">Langenhagen (Han)</odvPlaceElem>
<odvPlaceElem listIndex="6" selected="0" omc="7143254" placeID="2" value="6:7143254:2" span="0" type="remote" matchQuality="998008" mainPlace="1">Langenhahn</odvPlaceElem>
<odvPlaceElem listIndex="7" selected="0" omc="3357016" placeID="13" value="7:3357016:13" span="9" type="local" matchQuality="998008" mainPlace="0">Langenhausen</odvPlaceElem>
<odvPlaceElem listIndex="8" selected="0" omc="3257019" placeID="2" value="8:3257019:2" span="9" type="local" matchQuality="998007" mainPlace="1">Lauenhagen</odvPlaceElem>
<odvPlaceElem listIndex="9" selected="0" omc="3241010" placeID="15" value="9:3241010:15" span="9" type="local" matchQuality="993011" mainPlace="0">Maspe (Langenhagen)</odvPlaceElem>
<odvPlaceInput>langenhagen</odvPlaceInput>
</itdOdvPlace>
<itdOdvName state="notidentified" method="auto">
<odvNameElem>hbf</odvNameElem>
<odvNameInput>hbf</odvNameInput>
</itdOdvName>
</itdOdv>[/XML]

Wenn ich jetzt folgende XPath Abfrage schicke:

```
//itdOdv[@usage='origin']/itdOdvPlace/odvPlaceElem/attribute::type
```
bekomme ich wunderbar die Attribute nach einander aufgelistet.
Ich kann aber jedoch irgendwie nicht die Namen (der Haltestellen) selbst rauslesen. Also ich probiere es mit

```
//itdOdv[@usage='origin']/itdOdvPlace/odvPlaceElem
```
Bekomme aber lauter "null"en Zurück. Wenn ich die oben stehende Anweisung mit einem Firefox XPath plugin teste (XPather 1.4.5) so liefert er mir die von mir erwartete Treffer zurück.
Ich weiß um ehrlich zu sein nicht weiter, kann mir wer einen Tipp geben?

P.S. ich hoffe, dass es richtig war, meine Frage hier zu posten und keinen neuen Thread zu öffnen...


Edit:
ich bin ja so doof. Hier die Lösung:
statt

```
System.out.println(nodes.item(i).getNodeValue());
```
muss ich nur

```
System.out.println(nodes.item(i).getTextContent());
```
benutzen


----------

