XML parsen mit JDOM/SAXBuilder

Snape

Erfahrenes Mitglied
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:

Code:
<?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
Code:
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:

Code:
	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?
 
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.
Code:
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:
Code:
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
 
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:
Code:
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

Thx, funktioniert einwandfrei. Nun nur noch ein bisschen herumspielen, falls name, vorname usw. als Attribute abgelegt sind und nicht als Elemente.
 
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 ;)
 
Zurück