# XML Datei mit DOM auslesen (Text mit Attributen)



## eidel (16. Sep 2010)

Hallo,

ich versuche gerade, ein XML-Datei auszulesen. Diese ist wie folgt aufgebaut:
[XML]
<?xml version="1.0" encoding="utf-8" ?>
<settings>
	<bauteile>
		<bauteil name='Rundrohr' price='25.37' />
		<bauteil name='Blech' price='34.41' />
	</bauteile>
</settings>
[/XML]
Ich versuche, die Datei mit DOM auszulesen und habe mich durch den "Baum" (soll noch erweitert werden) bis "bauteile" durchgehangelt. Jetzt lasse ich mir die Kinder durch getChildNotes() geben.
Wenn ich jetzt versuche, die Attribute der einzelnen Kinder durch getAttributes() abzurufen kommt immer "null" zurück, da die Kinder als Text-Nodes erkannt werden. Wie kann ich das ändern?
Hier mal die fragliche Methode (getTeile liefert die NodeList, die bei getChildNotes() herauskommt):

```
public String[][] getBauteile(){
		NodeList bauteile = getTeile(doc);
		String[][] teile = new String[2][bauteile.getLength()];
		for(int i = 0; i < bauteile.getLength(); i++){
			NamedNodeMap bauteil = bauteile.item(i).getAttributes();
			teile[0][i] = bauteil.getNamedItem("name").getNodeName();
			teile[1][i] = bauteil.getNamedItem("price").getNodeName();
		}
		return teile;
}
```
Wenn ihr sonst irgendwelche Anmerkungen habt in Sachen eleganterem Code, könnt ihr das gerne sagen. In Sachen XML-Parsen bin ich kompletter Anfänger.

mfg eidel


----------



## eRaaaa (17. Sep 2010)

Mhm, was heißt du hast dich durchgehangelt? Vermutlich liegt dort der Fehler?
Und [c]bauteil.getNamedItem("name").getNodeName()[/c] macht natürlich keinen Sinn, du willst doch vermutlich [c]getNodeValue()[/c] oder ? 
Also anstelle des "durchhangelns" würde ich evtl. die Methode 
	
	
	
	





```
getElementsByTagName
```
 benutzen.(auch wenn ichs selbst noch nie gemacht habe *g*)

Probiere mal ob folgendes bei dir geht:

```
public String[][] getBauteile() {
		NodeList bauteile = doc.getElementsByTagName("bauteil");
		String[][] teile = new String[2][bauteile.getLength()];
		for (int i = 0; i < bauteile.getLength(); i++) {
			NamedNodeMap bauteil = bauteile.item(i).getAttributes();
			teile[0][i] = bauteil.getNamedItem("name").getNodeValue();
			teile[1][i] = bauteil.getNamedItem("price").getNodeValue();
		}
		return teile;
	}
```

liefert bei mir

[TABLE="width=10%]Rundrohr|Blech
25.37|34.41
[/TABLE]


----------



## eidel (20. Sep 2010)

Danke, deine Lösung funktioniert auch bei mir.

"Durchhangeln" habe ich aus einem Java-Buch, die dort geschrieben haben, das wäre der Standardweg. Es meint, dass man sich mithilfe einer rekursiven Methode, getChildNodes(), getNodeName() und item() immer weiter an den richtigen Wert herantastet. Eine Methode wie getElementsByTagName(), die das Ganze ja immens vereinfacht, wurde dort verschwiegen und ich habe auch nicht danach gesucht.

Names und Values habe ich aus Unerfahrenheit vertauscht.

mfG
eidel


----------

