# Attribute von Elementen auslesen mit XPath



## Steffilein (6. Mai 2011)

Hi,
ich bin völlig neu in Java und bin grad dabei aus einer XML-Datei die Attribut-Werte der Elemente auszulesen.
An und für sich ist das kein Problem. Die Werte werden ausgelesen und in folgender Form auf der Konsole ausgeben:
X1
X2
X3
X4
Y1
Y2
Y3
Y4

Alles schön und gut, aber ich hätte es gern in der Form:
X1 | Y1
X2 | Y2
X3 | Y3
X4 | Y4
usw... und genau da liegt das Problem

Mein Code sieht folgendermaßen aus:

```
public class XPathDemo
{
	public static void main( String[] args ) throws Exception
	  {
		String filename  = "Krankenhaus.xml";
	    Document doc = new SAXBuilder().build( filename );
	    int i=1;
	    

	    List<?> id = XPath.selectNodes( doc, "/krankenhaus/patienten/patient/@ID" );    
	    for ( Object object : id ) 
	    {
	      Attribute attribute = (Attribute) object;
	      System.out.print( attribute.getValue() + " | "  );
	      Object name = XPath.selectSingleNode( doc, "/krankenhaus/patienten/patient[i]/@name" );
	      System.out.println( ((Attribute) name).getValue() );	 
	      i++;
	    }

	  }
	}
```

Meldung in der Konsole:*P0001 | Exception in thread "main" java.lang.NullPointerException
	at XPathDemo.main(XPathDemo.java:25)*

ich denke, dass Problem liegt sicherlich in der Laufvariable i. Ich hab aber keine Ahnung wie ich dem Programm verständlcih machen soll, dass es immer den Namen vom i. Patienten ausgeben soll...

Falls es jemand test möchte, hier noch kurz der XML-Code
[XML]<krankenhaus>
	<patienten>
		<patient ID= "P0001" name= "Hans Mueller" />
		<patient ID= "P0002" name= "Kira Baum" />
		<patient ID= "P0003" name= "Anne Nothaft"/>
		<patient ID= "P0004" name= "Christian Graf" />
	</patienten>			
</krankenhaus>[/XML]

ICh sag schonmal vielen Dank für euere Hilfe 

LG, Steffi


----------



## eRaaaa (6. Mai 2011)

Also meine erste Frage wäre, wieso du zwei XPath-Ausdrücke benutzen möchtest? In deinem Fall würde ja ein Selektieren von allen Attributen ausreichen oder?
Ansonsten würde ich auch allgemein hier eher zur normalen for-Schleife tendieren:


```
List<?> id = XPath.selectNodes(doc, "/krankenhaus/patienten/patient/@*");
		for (int j = 0; j < id.size(); j+=2) {
			System.out.println(((Attribute)id.get(j)).getValue() + " | " + ((Attribute)id.get(j+1)).getValue());
		}
```

oder du selektierst eben die Elemente (hier könntest du auch wieder die for-each nehmen evtl.)

```
List<?> id = XPath.selectNodes(doc, "/krankenhaus/patienten/patient");
		for (int j = 0; j < id.size(); j++) {
			Element e = (Element) id.get(j);
			System.out.println(e.getAttributeValue("ID")+" | "+e.getAttributeValue("name"));
		}
```


----------



## Steffilein (6. Mai 2011)

Vielen Dank für die schnelle Hilfe, ich werde das gleich mal ausprobieren...

Und zu deiner Frage, wieso ich 2 XPath-Ausdrücke benutzen möchte... Weil ich im Moment noch nicht den Durchblick habe, und grad erst dabei bin, dass zu verstehen


----------

