XML Datei mit JDOM einlesen und verarbeiten

Zombeibraut

Mitglied
Hallo zusammen,

ich arbeite gerade zum ersten Mal mit JDOM und stoße leider auf ein paar Probleme, die mir auch Google und die Suchfunktion nicht lösen konnten.

Ich habe folgende XML Datei pbx.xml:

[XML]<?xml version="1.0" encoding="utf-8"?>
<info>
<user cn="Dritter Third" id="3" e164="103" dn="Dritter T." h323="Dritter T."><device hw="IP110-15-71-cf"/><device hw="Dritter T."/></user>
<user cn="Erster First" id="1" e164="101" dn="Erster F." h323="Erster F."><device hw="IP222-2f-05-08"/><device hw="Erster F."/></user>
<user cn="Fuenfter Fifth" id="5" e164="105" dn="Fuenfter F." h323="Fuenfter F."><device hw="Fuenfter F."/></user>
<user cn="Sechster Sixth" id="6" e164="106" dn="Sechster S." h323="Sechster S."><device hw="Sechster S."/></user>
<user cn="Vierter Fourth" id="4" e164="104" dn="Vierter F." h323="Vierter F."><device hw="IP240-27-07-88"/></user>
<user cn="Zweiter Second" id="2" e164="102" dn="Zweiter S." h323="Zweiter S."><device hw="IP222-2f-00-71"/><device hw="Zweiter S."/></user>
</info>[/XML]

Diese möchte ich gern in mein Javaprogramm einlesen um anschließend die einzelnen User mit ihren Attributen cn, id, e164 usw. weiterzuverarbeiten. Bisher habe ich es immerhin geschafft die komplette Datei einzulesen und mir die einzelnen Elemente (ohne Attribute) anzeigen zu lassen.

Java:
import java.io.File; 
import java.io.IOException; 
import java.util.Iterator;
import java.util.List; 

import org.jdom2.Attribute;
import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.JDOMException; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.output.XMLOutputter; 

class JDOMLesen { 

    public static void main(String[] args) { 


        File file = new File("c:\\pbx.xml");

        try { 
            // Das Dokument einlesen
            SAXBuilder builder = new SAXBuilder(); 
            Document doc = builder.build(file); 
            
            XMLOutputter fmt = new XMLOutputter(); 

            // komplettes Dokument ausgeben 
            fmt.output(doc, System.out); 

            // Wurzelelement ausgeben 
            Element root = doc.getRootElement(); 
            System.out.println("\nWurzelelement: " + root); 

            // Wurzelelementnamen ausgeben 
            System.out.println("Rootelement: " + root.getName()); 
            
            Element user = root.getChild("user");
			System.out.println("Kind1: " +root.getChild("user"));
			
			Element device = user.getChild("device");
			System.out.println("Kind2: " + device);

            // Eine Liste aller direkten Kindelemente eines Elementes erstellen 
            List users = root.getChildren("user"); 
            System.out.println("Childelement: " 
                    + ((Element) users.get(0)).getName()); 
            System.out.println(users);          
           
        } catch (JDOMException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

Als Ausgabe erhalte ich Folgendes:

Java:
<?xml version="1.0" encoding="UTF-8"?>
<info>
<user cn="Dritter Third" id="3" e164="103" dn="Dritter T." h323="Dritter T."><device hw="IP110-15-71-cf" /><device hw="Dritter T." /></user>
<user cn="Erster First" id="1" e164="101" dn="Erster F." h323="Erster F."><device hw="IP222-2f-05-08" /><device hw="Erster F." /></user>
<user cn="Fuenfter Fifth" id="5" e164="105" dn="Fuenfter F." h323="Fuenfter F."><device hw="Fuenfter F." /></user>
<user cn="Sechster Sixth" id="6" e164="106" dn="Sechster S." h323="Sechster S."><device hw="Sechster S." /></user>
<user cn="Vierter Fourth" id="4" e164="104" dn="Vierter F." h323="Vierter F."><device hw="IP240-27-07-88" /></user>
<user cn="Zweiter Second" id="2" e164="102" dn="Zweiter S." h323="Zweiter S."><device hw="IP222-2f-00-71" /><device hw="Zweiter S." /></user>
</info>

Wurzelelement: [Element: <info/>]
Rootelement: info
Kind1: [Element: <user/>]
Kind2: [Element: <device/>]
Childelement: user
[[Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>]]

Ich würde mich freuen, wenn mir jemand weiterhelfen kann.
Viele Grüße
 
Zuletzt bearbeitet:

Zombeibraut

Mitglied
Oh tut mir leid, war vielleicht etwas schwammig formuliert.

Also ich würde gern die einzelnen User Erster, Zweiter usw. so aus der XML einlesen mit allen Attributen, dass ich die entsprechenden Daten so an eine Klasse Benutzer senden und als deren Instanz verwenden kann. Am Schluss möchte ich die Benutzer dann per JDBC an eine Datenbank weiterleiten.

Ist das so überhaupt machbar, wie ich mir das vorstelle, oder gehe ich völlig falsch an die Sache ran?

Viele Grüße

______________________________________________________________________________________

Ich bin noch einen Schritt weiter gekommen und kann mir jetzt die Attribute mit Werten vom ersten User und ersten Device ausgeben lassen. Jetzt bräuchte ich also nur noch Hilfe dabei, wie ich das selbe wie für übrigen User hin bekomme.

Java:
			//Attribute des ersten Users ausgeben
			Attribute name = user.getAttribute("cn");
			String nameName = name.getName();
			String nameValue = name.getValue();
			System.out.println("Name: "+ nameName + ": " + nameValue);
			
			Attribute id = user.getAttribute("id");
			String idName = id.getName();
			String idValue = id.getValue();
			System.out.println("ID: " + idName +": "+ idValue);
			
			Attribute tel = user.getAttribute("e164");
			String teleName = tel.getName();
			String teleValue = tel.getValue();
			System.out.println("Telefonnummer: " + teleName +": "+ teleValue);
			
			Attribute dn = user.getAttribute("dn");
			String dnName = dn.getName();
			String dnValue = dn.getValue();
			System.out.println("Kürzel: " + dnName +": "+ dnValue);
			
			//Second Child ausgeben
			Element device = user.getChild("device");
			System.out.println("Kind2: " + device);
			
			//Attribute des ersten Devices ausgeben
			Attribute hw = device.getAttribute("hw");
			String hwName = hw.getName();
			String hwValue = hw.getValue();
			System.out.println("MAC: " + hwName + ": " + hwValue);

Dabei erhalte ich nun folgende Ausgabe:

Java:
<?xml version="1.0" encoding="UTF-8"?>
<info>
<user cn="Dritter Third" id="3" e164="103" dn="Dritter T." h323="Dritter T."><device hw="IP110-15-71-cf" /><device hw="Dritter T." /></user>
<user cn="Erster First" id="1" e164="101" dn="Erster F." h323="Erster F."><device hw="IP222-2f-05-08" /><device hw="Erster F." /></user>
<user cn="Fuenfter Fifth" id="5" e164="105" dn="Fuenfter F." h323="Fuenfter F."><device hw="Fuenfter F." /></user>
<user cn="Sechster Sixth" id="6" e164="106" dn="Sechster S." h323="Sechster S."><device hw="Sechster S." /></user>
<user cn="Vierter Fourth" id="4" e164="104" dn="Vierter F." h323="Vierter F."><device hw="IP240-27-07-88" /></user>
<user cn="Zweiter Second" id="2" e164="102" dn="Zweiter S." h323="Zweiter S."><device hw="IP222-2f-00-71" /><device hw="Zweiter S." /></user>
</info>

Wurzelelement: [Element: <info/>]
Rootelement: info
Kind1: [Element: <user/>]
Name: cn: Dritter Third
ID: id: 3
Telefonnummer: e164: 103
Kürzel: dn: Dritter T.
Kind2: [Element: <device/>]
MAC: hw: IP110-15-71-cf
Kind3: null
Childelement: user
[[Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>], [Element: <user/>]]

Hat jemand einer Idee, wie ich das nun für die übrigen Zeilen weiter führen kann?
 
Zuletzt bearbeitet:

KSG9|sebastian

Top Contributor
Natürlich..jetzt wirds Licht :)

Du hast eigentlich schon alles.

Der Code den du gepostet hast fpr die User-Attribute, den einfach in ne Schleife packen:

Java:
   List users = root.getChildren("user"); 
for(int i=0; i<users.size(); i++){
 Element user = (Element) users.get(i);
            //Attribute des ersten Users ausgeben
            Attribute name = user.getAttribute("cn");
            String nameName = name.getName();
            String nameValue = name.getValue();
            System.out.println("Name: "+ nameName + ": " + nameValue);
            
            Attribute id = user.getAttribute("id");
            String idName = id.getName();
            String idValue = id.getValue();
            System.out.println("ID: " + idName +": "+ idValue);
            
            Attribute tel = user.getAttribute("e164");
            String teleName = tel.getName();
            String teleValue = tel.getValue();
            System.out.println("Telefonnummer: " + teleName +": "+ teleValue);
            
            Attribute dn = user.getAttribute("dn");
            String dnName = dn.getName();
            String dnValue = dn.getValue();
            System.out.println("Kürzel: " + dnName +": "+ dnValue);
            
            //Second Child ausgeben
            Element device = user.getChild("device");
            System.out.println("Kind2: " + device);
            
            //Attribute des ersten Devices ausgeben
            Attribute hw = device.getAttribute("hw");
            String hwName = hw.getName();
            String hwValue = hw.getValue();
            System.out.println("MAC: " + hwName + ": " + hwValue);

}
 

Zombeibraut

Mitglied
Super, vielen Dank!

Jetzt würde ich das gern äquivalent auch für die devices machen:

Java:
			Element user = root.getChild("user");
			List devices = user.getChildren("device");
			for(int j=0; j<devices.size(); j++){
			Element device = (Element) devices.get(j);	
			
			//Attribute des ersten Devices ausgeben
			Attribute hw = device.getAttribute("hw");
			String hwName = hw.getName();
			String hwValue = hw.getValue();
			System.out.println("MAC: " + hwName + ": " + hwValue);
			}

Allerdings bekomme ich so nur die Attribute des ersten device ausgegeben.
Wo liegt mein Fehler?
 
N

nillehammer

Gast
Erst mal ein allgemeiner Tipp. JDOM2 unterstützt Generics. Die solltest Du auch nutzen. Dadurch sparst Du Dir eine Menge Gecaste, z.B. hier:
[JAVA=43]
// Eine Liste aller direkten Kindelemente eines Elementes erstellen
List users = root.getChildren("user"); //<-- Nicht so gut, weil ohne Generics
System.out.println("Childelement: "
+ ((Element) users.get(0)).getName()); // <-- Deswegen ist hier ein Cast nötig

// Besser so:
List<Element> users = root.getChildren("user");
System.out.println("Childelement: " + users.get(0).getName());
[/code]
Für die Iteration (.z.B. über die users) kannst Du anstatt der for-Schleife mit index auch die etwas schönere for-each-Schleife nehmen:
Java:
for(Element user : users ) {
  // den ganzen user-Kram ausgeben
}
Zombeibraut hat gesagt.:
Allerdings bekomme ich so nur die Attribute des ersten device ausgegeben.
Wo liegt mein Fehler?
Abgesehen von dem Fehlen der Generics und dem Verwenden eines Index statt foreach sieht der Code gut aus. Kann es sein, dass Du den Code unglücklicherweise mit einem User-Element getestet hast, das nur ein device enthält (ids 4,5,6)?
 

Zombeibraut

Mitglied
Danke für den Tipp, das werde ich gleich mal ausprobieren!

Ja, da wird der Fehler liegen. Dann nehme ich die Abfrage nach den Devices am besten einfach auch mit in die Schleife um alle abzugreifen, oder?

Danke für die schnelle Hilfe :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
M mit JDOM XML-Datei einlesen, die nicht "well-formed&quo XML & JSON 3
S JDOM XML Datei darstellen Fehler! XML & JSON 2
K xml Datei mit JDOM erzeugen, Problem Namespaces XML & JSON 1
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
J XML-Datei ein Array einlesen XML & JSON 10
M xml - datei erstellen XML & JSON 2
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
G Tags oder Zeilen der Not-Validen XML-Datei XML & JSON 7
C Suche in XML-Datei XML & JSON 6
D Zeilennummer in der XML - Datei XML & JSON 5
S Einlesen einer xml Datei XML & JSON 4
M Datei parsen XML & JSON 5
S PDF Erzeugung - Probleme mit der XML Datei bei Schema-Infos XML & JSON 2
S XML Datei einlesen, aber root überspringen XML & JSON 2
T Werte in XML Datei an entsprechender Stelle einfügen XML & JSON 3
Saxony unbekannte XML Datei parsen und ausgeben XML & JSON 10
L XML Datei in Java angeben Pfad? XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
A SVG Datei auslesen und Batik XML & JSON 1
N neue XML-Datei erstellen mit vorhandener Struktur XML & JSON 18
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
L bz2-Datei parsen XML & JSON 9

Ähnliche Java Themen

Neue Themen


Oben