# XML parsen mit JDOM/SAXBuilder



## Snape (19. Mai 2004)

Tach,
scheinbar stehe ich etwas auf der Leitung, aber aus dem "Tutorial" geht leider in keinster Weise hervor, wie die Lesezugriffe auf die XML-Datei funktionieren.
Also... ich habe folgende XML-Datei:


```
<?xml version="1.0"?>

<adresses>
   <adresse>
      <name>Mustermann</name>
      <vorname>Hans</vorname>
      <strasse>Musterstrasse</strasse>
      <hausnummer>471</hausnummer>
      <postleitzahl>12345</postleitzahl>
      <wohnort>Berlin</wohnort>
   </adresse>
   <adresse>
      <name>Mustermann</name>
      <vorname>Kurt</vorname>
      <strasse>Kaiserstrasse</strasse>
      <hausnummer>4</hausnummer>
      <postleitzahl>98765</postleitzahl>
      <wohnort>Kleinkleckersdorf</wohnort>
   </adresse>
   <adresse>
      <name>Tunichtgut</name>
      <vorname>Elfriede</vorname>
      <strasse>Bahnhofstrasse</strasse>
      <hausnummer>1</hausnummer>
      <postleitzahl>55555</postleitzahl>
      <wohnort>Hogsmeade</wohnort>
   </adresse>
   <adresse>
      <name>Dumbledore</name>
      <vorname>Albus</vorname>
      <strasse>Hexenstrasse</strasse>
      <hausnummer>666</hausnummer>
      <postleitzahl>66666</postleitzahl>
      <wohnort>Hogwarts</wohnort>
   </adresse>
</adresses>
```

Nun möchte ich die einzelnen Adressen auslesen in der Form

```
for ( int i = 0; i < adresse.anzahl; i++)
{
  Element element = (Element)adresse.get( i );
  String sName = element.get("name");
  String sVorname = element.get("vorname");
  String sStrasse = element.get("strasse"); // usw. so, dass in den Strings auch die enthaltenen Werte drin stehen, als Name "Mustermann" usw.
}
```

Wie zum Henker geht das? Der o.a. Code ist natürlich falsch.
Mein bescheidener Ansatz sieht derzeit so aus:


```
private final void readXML()
	{
		SAXBuilder sxbuild = new SAXBuilder();
		InputSource is = new InputSource("D:\\eclipse\\workspace\\HFTests\\src\\TableTest\\adressen.xml");
		try
		{		
			Document doc = sxbuild.build(is);
			Element root = doc.getRootElement();
			List children = root.getChildren();
			for (int i = 0; i < children.size(); i++)
			{
				Element child = (Element)children.get( i );
				System.out.println("Child: " + child.toString());
				List content = child.getContent();
				for (int j = 0; j < content.size(); j++)
				{
					Object cont = content.get( j );
					System.out.println("Content: " + cont.toString());
					if ( cont instanceof Element )
					{ // im XML Dokument verstecken sich auch noch '\n'
						String sName = ((Element)cont).getName();
						System.out.println("Name: " + sName);
						List values = ((Element)cont).getContent();
						System.out.println("Wert: " + values.get(0).toString());
					}
				}
			}
			int i = 1;
		}
		catch(Exception e){}
				
	}
```

Aber das ist weder prickelnd noch annähernd das, was ich mir wünsche, s.o.
Wo liegt mein Denkfehler?


----------



## Christian Fein (19. Mai 2004)

> scheinbar stehe ich etwas auf der Leitung, aber aus dem "Tutorial" geht leider in keinster Weise hervor, wie die Lesezugriffe auf die XML-Datei funktionieren.



Steht doch in meinem Tutorial drinne:


<-------------------------------------------->

Einlesen mit SAXBuilder. "path" ist der komplette Pfad zur XML-Datei.

```
import org.jdom.*;
import org.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
// Klassendeklaration usw ausgelassen

SAXBuilder sxbuild 
     = new SAXBuilder();
InputSource is 
     = new InputSource(path);
Document doc = sxbuild.build(is);
Element root = doc.getRootElement();
```

Nun wurde ein Dokument eingelesen. 
<--------------------------------------------->

path = "/tmp/mfile.xml";  // bzw path = "C:\\temp\\myfile.xml"

InputSource is = new InputSource(path); 
 ^-- erstellt eine InputSource mit dem FileInhalt
Document doc = saxbuilder.build(is); <-- liest die InputSource und erstellt daraus
ein Document.


Das Auslesen des Dokuments machst du irgendwie etwas "seltsam" 

Bastel das entsprechend eher so um, es geht einfacher als du denkst:

```
List list = root.getChildren("adresse");
Iterator iterator = list.iterator();
while(iterator.hasNext())
    readAdress( (Element) iterator.next());

......
private void readAdress(Element element) {
   String name = element.getChild("name").getText();
   String vorname  = element.getChild("vorname").getText();
    usw
}
```

gruesse


----------



## Snape (19. Mai 2004)

> _Original geschrieben von Christian Fein _
> Steht doch in meinem Tutorial drinne:
> <-------------------------------------------->
> Einlesen mit SAXBuilder. "path" ist der komplette Pfad zur XML-Datei.



Das war ja nicht das Problem...



> path = "/tmp/mfile.xml";  // bzw path = "C:\\temp\\myfile.xml"



Diese Info fehlte z.B. ;-)
(Also nur Pfad oder Pfad+Dateiname?)



> Das Auslesen des Dokuments machst du irgendwie etwas "seltsam"



Genau das war das eigentliche Problem. 



> Bastel das entsprechend eher so um, es geht einfacher als du denkst:
> 
> ```
> List list = root.getChildren("adresse");
> ...



Thx, funktioniert einwandfrei. Nun nur noch ein bisschen herumspielen, falls name, vorname usw. als Attribute abgelegt sind und nicht als Elemente.


----------



## Christian Fein (19. Mai 2004)

> _Original geschrieben von Snape _
> *
> Diese Info fehlte z.B. ;-)
> (Also nur Pfad oder Pfad+Dateiname?)
> *



Nein die Info stand auch drinne.  Follgender Satz steht im Tutorial:
Einlesen mit SAXBuilder. "path" ist der komplette Pfad zur XML-Datei.

Ein Kompletter Pfad ist immer Dateiname und Pfad


----------

