# XML Parsen JDOM NullPointerEcxeption



## MarkusKirch (18. Mrz 2011)

Hey Leute!
Ich versuche, dieses XML File mit täglich aktuellen Währungskursen einzulesen in 2 Arrays, eins mit dem Namen der Währung und eins mit dem zugehörigen Wert (zugeordnet über einen Counter i)!
Habe folgenden Code geschrieben, müsste soweit laufen, allerdings bekomme ich immer eine NullPointerException in der Zeile 37:
[JAVA=37]alleWaehrungen=root.getChild("Cube").getChild("Cube").getChildren();[/code]
Ich denke, das liegt daran, dass ich alleWaehrungen nicht explizit erzeugt habe, aber wie macht man das?
Wisst ihr vllt, woran es liegt, bzw wie ich den Fehler umgehen kann?

VG und Danke für die Hilfe

Markus


```
//Importe
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class waehrungsRechner{ //Klasse fängt an
	//Deklarationen
	private String[] waehrungsName;
	private String[] waehrungsKurs;
	private String Datum;
	private String aktuellerWaehrungsName;
	private String aktuellerWaehrungsKurs;
	private SAXBuilder builder;
	private Document doc;
	private Element root;
	private List<?> alleWaehrungen;
	
	public void readxml(){ //XML auslesen Funktion
		try {
			//Erzeugungen
			SAXBuilder builder=new SAXBuilder();
			Document doc=new Document();
			doc = builder.build("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
			Element root=new Element("root");
			root=doc.getRootElement();
			List<?> alleWaehrungen=new ArrayList();
			alleWaehrungen=root.getChild("Cube").getChild("Cube").getChildren();//Hinzufügen der <Cube currency="Währung" rate="1.00"> Tags in die Liste

			[...]

	 	} catch (JDOMException e) {
	 		e.printStackTrace();
	 	} catch (IOException e) {
	 		e.printStackTrace();
	 	}
	}
}
```


----------



## eRaaaa (18. Mrz 2011)

Naja, was soll man dir jetzt viel sagen? Du hast ja nicht einmal die XML Datei gepostet. Klar ist, dass getChild null zurück liefert wenn das Kind nicht gefunden werden kann , siehe JDOM v1.1.1
D.h. wahrscheinlich der Pfad passt nicht, hast du wirklich eine Hierarchie alà <Child>...<Child>...<Child></Child></Child> ?


----------



## MarkusKirch (18. Mrz 2011)

Hey!
Danke erstmal für die Antwort!
Ich dachte eigentlich, man könnte die Datei aus dem Code lesen...
Aber hier ist also nochmal der Link zur Datei:
http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml

VG Markus


----------



## eRaaaa (18. Mrz 2011)

MarkusKirch hat gesagt.:


> Ich dachte eigentlich, man könnte die Datei aus dem Code lesen...



Oh ja sorry, habe ich übersehen, dass dort zu einer externen URL gelinkt wurde!
Dein Namespace passt dort nicht, für Cube lautet dieser ja :http://www.ecb.int/vocabulary/2002-08-01/eurofxref daher findet der das Kind so auch nicht, probiere mal:

```
Namespace ns = Namespace.getNamespace("http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
          alleWaehrungen=root.getChild("Cube", ns).getChild("Cube", ns).getChildren();
```


----------



## MarkusKirch (19. Mrz 2011)

Vielen Dank, das hat funktioniert, aber nun habe ich den selben Fehler in der Zeile 47.
Im Debug Mode ist aktuellerWaehrungsName=null, also nimmt er entweder den "else" Weg oder findet kein Attribut rate...
Könnt ihr mir bitte nochmal helfen, ich weiß wirklich nicht mehr weiter!

Vielen Dank

Markus



```
public class waehrungsRechner{
	private Attribute[] waehrungsName;
	private Attribute[] waehrungsKurs;
	private String Datum;
	private Attribute aktuellerWaehrungsName;
	private Attribute aktuellerWaehrungsKurs;
	private int i;
	SAXBuilder builder;
	Document doc;
	Element root;
	List<?> alleWaehrungen;
	
	public void readxml(){
		try {
			SAXBuilder builder=new SAXBuilder();
			Document doc=new Document();
			doc = builder.build("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
			Element root=new Element("root");
			root=doc.getRootElement();
			Namespace ns = Namespace.getNamespace("http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
			alleWaehrungen=root.getChild("Cube", ns).getChild("Cube", ns).getChildren();
			for(i=0;i<alleWaehrungen.size();i++){
				if( ((Element) alleWaehrungen.get(i)).getChild("Cube", ns)!=null){
					aktuellerWaehrungsName=((Element) alleWaehrungen.get(i)).getAttribute("currency");
				}else{
					aktuellerWaehrungsName=null;
				}
				
				if( ((Element) alleWaehrungen.get(i)).getChild("Cube", ns)!=null){
					aktuellerWaehrungsKurs=((Element) alleWaehrungen.get(i)).getAttribute("rate");
				}else{
					aktuellerWaehrungsKurs=null;
				}
				
				//System.out.println(aktuellerWaehrungsName);
				//System.out.println(aktuellerWaehrungsKurs);
				
				waehrungsName[i]=(Attribute) aktuellerWaehrungsName;
				waehrungsKurs[i]=(Attribute) aktuellerWaehrungsKurs;
			}
			for(i=0;i<waehrungsName.length;i++) {
				System.out.println(waehrungsName[i]);
				System.out.println(waehrungsKurs[i]);
				System.out.println("");
			}
	 	} catch (JDOMException e) {
	 		e.printStackTrace();
	 	} catch (IOException e) {
	 		e.printStackTrace();
	 	}
	}
}
```


----------



## eRaaaa (19. Mrz 2011)

```
import java.io.IOException;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;

public class waehrungsRechner {
	private Attribute[] waehrungsName;
	private Attribute[] waehrungsKurs;
	private String Datum;
	private Attribute aktuellerWaehrungsName;
	private Attribute aktuellerWaehrungsKurs;
	private int i;
	SAXBuilder builder;
	Document doc;
	Element root;
	List<?> alleWaehrungen;

	public void readxml() {
		try {
			SAXBuilder builder = new SAXBuilder();
			Document doc = new Document();
			doc = builder
					.build("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
			Element root = new Element("root");
			root = doc.getRootElement();
			Namespace ns = Namespace
					.getNamespace("http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
			alleWaehrungen = root.getChild("Cube", ns).getChild("Cube", ns)
					.getChildren();
			waehrungsName = new Attribute[alleWaehrungen.size()];
			waehrungsKurs = new Attribute[alleWaehrungen.size()];
			for (i = 0; i < alleWaehrungen.size(); i++) {
				if (alleWaehrungen.get(i) != null) {
					aktuellerWaehrungsName = ((Element) alleWaehrungen.get(i))
							.getAttribute("currency");
				} else {
					aktuellerWaehrungsName = null;
				}

				if (alleWaehrungen.get(i) != null) {
					aktuellerWaehrungsKurs = ((Element) alleWaehrungen.get(i))
							.getAttribute("rate");
				} else {
					aktuellerWaehrungsKurs = null;
				}

				waehrungsName[i] = (Attribute) aktuellerWaehrungsName;
				waehrungsKurs[i] = (Attribute) aktuellerWaehrungsKurs;
			}
			for (i = 0; i < waehrungsName.length; i++) {
				System.out.println(waehrungsName[i]);
				System.out.println(waehrungsKurs[i]);
				System.out.println("");
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

a) du musst die Arrays natürlich erst einmal noch erstellen mit new ! (siehe 35 und 36)
b) du hast ja schon Cibe+Cube selektiert und wenn du dann getChildren aufrufst, erhälst du ja schon eine Liste mit den dritten Cubes quasi, daher musst du die if-Abfragen nicht noch einmal getChild aufrufen!


----------



## MarkusKirch (19. Mrz 2011)

Hey!
Vielen Dank!
Jetzt läuft es super!
Ich bekomme ausgegeben:


```
[Attribute: currency="USD"]
[Attribute: rate="1.4130"]

[Attribute: currency="JPY"]
[Attribute: rate="114.68"]

[Attribute: currency="BGN"]
[Attribute: rate="1.9558"]

[Attribute: currency="CZK"]
[Attribute: rate="24.388"]

[Attribute: currency="DKK"]
[Attribute: rate="7.4568"]

[Attribute: currency="GBP"]
[Attribute: rate="0.87380"]

[Attribute: currency="HUF"]
[Attribute: rate="273.35"]

[...]
```

Mein Problem ist jetzt, dass ich aus den Attributen einen String bzw ein Double machen möchte.
Also meine hoffentlich letzte Frage zu diesem Thema:
Wie kann ich das Attribut waehrungsName_ in einen String konvertieren, der "USD" beinhaltet und wie kann ich das Attribut waehrungsKurs in ein Double konvertieren, das "1.4130" beinhaltet?

VG Markus_


----------



## MarkusKirch (19. Mrz 2011)

Ok, habe es selbst herausgefunden, hier die Lösung:
getAttributeValue() liefert den Wert des Attribut, kann man sich ja auch denken...


Vielen Dank für deine Hilfe, eRaaaa!!!


----------

