Kindelemente mit JDOM eines bestimmten Attributes auslesen

Wambui

Aktives Mitglied
Hallo,

ich suche eine Möglichkeit, aus dieser XML-Datei
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <city name="München">
    <distance>221.357</distance>
    <duration>2.32</duration>
  </city>
  <city name="Frankfurt">
    <distance>204.365</distance>
    <duration>2.049</duration>
  </city>
  <city name="Köln">
    <distance>367.153</distance>
    <duration>3.404</duration>
  </city>
</root>

mit dem entsprechenden Attribut der City-Elemente dei passenden Werte der Kindelemente auszulesen.
Dieser Versuch liefert eine NullPointerException:
Java:
package com.company;

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import java.io.IOException;


public class ReadXmlFile {
    public static void main(String[] args) throws IOException, JDOMException {
        SAXBuilder builder = new SAXBuilder();
        Document jdomDoc = builder.build("City.xml");

        Element root = jdomDoc.getRootElement();



        for (int i = 0; i < root.getContentSize(); i++) {
            Content content = root.getContent().get(i);
            if (content instanceof Element) {
                if ("München".equals(((Element) content).getChild("city").getAttributeValue("name"))) {
                    System.out.println(((Element) content).getChildText("distance"));
                }

            }

        }
    }
}

Während diese Version alle Werte der Distance-Elemente aller City-Elemente liefert:
Java:
package com.company;

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import java.io.IOException;

public class ReadXmlFile {
    public static void main(String[] args) throws IOException, JDOMException {
        SAXBuilder builder = new SAXBuilder();
        Document jdomDoc = builder.build("StuttgartCity.xml"); //Bildet gesamtes XML im Speicher ab

        Element root = jdomDoc.getRootElement();
        
        for (int i = 0; i < root.getContentSize(); i++) {
            Content content = root.getContent().get(i);
            if (content instanceof Element) {
                if ("München".equals(root.getChild("city").getAttributeValue("name"))) {
                    System.out.println(((Element) content).getChildText("distance"));
                }

            }

        }
    }
}

Wie kann ich mit jdom2 gezielt nur die Kindelemente mit einem bestimmten Attribut im Elternelement auslesen?

Gruß
Wambui
 

Harry Kane

Top Contributor
Zunächst mal solltest du deinen Bandwurm-Code mit den verketten Methodenaufrufen "aufknoten", damit du siehst, welches Element null ist. Dan solltest du auch erkennen, wieso es null ist, und warum der Code aus deinem ersten Beispiel nicht funktioniert.
Tipp: die Variable "root" steht für das Wurzelelement "root". "getContent" liefert dir, wie ich gerade aus der jdom-API gerlent habe, ALLE Kindknoten. Manche der Knoten in "getContent" heissen zwar "city", aber keiner der Kindknoten von "root" hat ein Kindknoten mit dem Namen "city".
Ich würde eher so vorgehen:
root.getChildren("city") liefert dir eine Liste mit allen city-Elementen unterhalb von "root".
Mit getAttributeValue("name") bekommst du den Namen der Stadt. Falls der passt, kannst du über getChild("distance") und getChild("duration") auf die jeweiligen Kindelemente von "city" zugreifen, und kannst daraus dann den Textinhalt (wahrscheinlich wieder über getContent()) auslesen.
 

Wambui

Aktives Mitglied
Danke, jetzt sehe ich das auch. Der ursprüngliche Gedankenansatz war, wenn ein Wert wie "München" in dem Attribute-Namen des Kindelements "city" auftaucht, dann zeige mir den gewünschten Text aus den Kindelementen von City mit dem passenden Attribut an.
Da komme ich nicht nicht ran.
Dass in
Java:
Element root = jdomDoc.getRootElement();
das gesamte XML-Document abgebildet wird, ist mir bewusst.
Es gibt mit org.jdom2.filter.Filter und org.jdom2.filter.AttributeFilter auch Interfaces mit denen man gegebenfalls das machen kann, was ich will. Ich finde aber keine gescheiten Examples, die die Anwendung dokumentieren und zeigen.
 
Zuletzt bearbeitet:

knilch

Bekanntes Mitglied
Suchst du vielleich so etwas?
Java:
public static void main(String[] args) {
    try {
        readXml();
    }
    catch(JDOMException ex) {
        System.out.println(ex);
    }
    catch(IOException ex) {
        System.out.println(ex);
    }
}

private static void readXml() throws JDOMException, IOException {
    SAXBuilder builder = new SAXBuilder();
    Document jdomDoc = builder.build("city.xml");
    Element root = jdomDoc.getRootElement();
    List<Element> cities = root.getChildren();
    for (Element element : cities) {
        System.out.println(element.getAttributeValue("name"));        
        for(Element e : element.getChildren())  {
            System.out.println("-" + e.getName() + ": " + e.getValue() );
        }
    }
}
 

Wambui

Aktives Mitglied
Im Prinzip habe ich das in anderer Schreibweise ohne "getName" auch schon. Das ist aber nicht mein Ziel.
Java:
private static void readXml() throws JDOMException, IOException {
    SAXBuilder builder = new SAXBuilder();
    Document jdomDoc = builder.build("city.xml");
    Element root = jdomDoc.getRootElement();
    List<Element> cities = root.getChildren();
    for (Element element : cities) {
        System.out.println(element.getAttributeValue("name"));        
        for(Element e : element.getChildren())  {
            System.out.println("-" + e.getName() + ": " + e.getValue() );
        }
    }

Ich habe ja nicht umsonst versucht, die if-Abfrage in Verbindung mit dem Attribut-Vergleich nach dem Namen der Stadt eingebaut. Abhängig von dem Attribut werden nur die zwei Elemente Dauer und Entfernung benötigt, denn nur die zwei werden später in einer GUI an die betreffenden Objekte übergeben. Da macht eine Liste aller Städte inklusive aller Elemente keinen Sinn.
 

knilch

Bekanntes Mitglied
Du möchtest also nur die Child- Elemente von einer Stadt, die du auswählen möchtest. Dann vielleicht so etwas?
Java:
import java.io.IOException;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;


public class Test {
    private static String xmlFile = "City.xml";
    public static void main(String[] args) {
        printCityElements("München");
    }
    
    private static List<Element> getRootElements() {
        SAXBuilder builder = null;
        Document jdomDoc = null;
        try {
            builder = new SAXBuilder();
            jdomDoc = builder.build(xmlFile);        
        } catch (JDOMException ex) {
            System.err.println(ex);
        } catch (IOException ex) {
            System.err.println(ex);
        }
        if(builder != null && jdomDoc != null) {
            return jdomDoc.getRootElement().getChildren();
        }
        else {
            return null;
        }
    }
    
    private static List<Element> getCityElements(String cityName){
        List<Element> cities = getRootElements();
        if(cities != null) {
            for (Element element : cities) {
                if(element.getAttributeValue("name").equals(cityName)) {
                    return element.getChildren();
                }
            }
        }
        return null;
    }
    
    private static void printCityElements(String cityName) {
        List<Element> elements = getCityElements(cityName);
        if(elements != null) {
            if(elements.size() > 0) {
                System.out.println(cityName);
                for (Element element : elements) {
                    System.out.println("-" + element.getName() + ": " + element.getValue() );
                }
            }
            else {
                System.err.println("Keine Elemente für " + cityName + " gefunden!");
            }
        }
    }
}
Statt printCityElements("München"); kannst du dann eine Methode erstellen, welche distance und duration in das Gui füllt.
 

Wambui

Aktives Mitglied
Ja, das sieht bereits besser aus. Und ich verstehe auch meinen Denkfehler. Ich wollte aus der Liste aller Elemente die Speziellen herausfiltern. Ich bin nicht auf die Idee gekommen, dass das ein Weg über zwei Schritte mit zwei Methoden ist.

Vielen Dank, das hilft mir in jedem Fall weiter,

Wambui
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F KindElemente lesen und begrenzen XML & JSON 0
D Stax mehrere "Kindelemente" zusammen XML & JSON 2
H Xpath kindelemente auslesen XML & JSON 2
P JDOM oder SAX XML & JSON 3
Hijo2006 Grundsätzliches zu JDOM 2.x XML & JSON 1
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S JDom XML ein Element hinzufügen. XML & JSON 1
C JDOM: Value ohne Unterelemente auslesen XML & JSON 1
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
J JDOM XMLOutputter getPrettyFormat() XML & JSON 3
H JDOM setAttribute Reihenfolge XML & JSON 3
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
F Aus XML mit JDOM aus Elementattributen Werte rauslesen XML & JSON 4
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
C xml validierung gegen xsd mit jdom: Fehlermeldung Cannot find the declaration of element ... XML & JSON 8
T Dom, Jdom, Sax XML & JSON 8
Helgon MalformedByteSequenceException und null JDOM Attribute XML & JSON 5
Helgon JDOM schreibt nicht XML & JSON 2
A XSl mit JDom auslesen XML & JSON 1
G xml, jdom "Entität wurde referenziert aber nicht deklariert." XML & JSON 4
A XSL und JDom XML & JSON 3
G jdom-Klassen in Eclipse importieren XML & JSON 2
S JDOM ohne XML Header erzeugen? XML & JSON 2
G JDOM - aus Children-Liste ein Child direkt ansprechen ohne XPath? XML & JSON 9
S JDOM nur Attribut Name XML & JSON 2
X JDom für SOAP Dateien geeignet? XML & JSON 3
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
M XML Parsen JDOM NullPointerEcxeption XML & JSON 7
S jdom hasChildren()? XML & JSON 1
T Frage zu getContent unter jdom XML & JSON 6
Z Tutorial für JDOM (XSD-Shema) XML & JSON 3
D jdom, xml, login-system XML & JSON 4
N JDOM: XML einlesen XML & JSON 4
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
lordcarlos jdom zu iso-8859-15 zwingen XML & JSON 4
P jdom XML-Encoding auslesen XML & JSON 12
E JDOM - letzem child Attribut hinzufügen XML & JSON 4
H Schema-Validierung mit JDOM XML & JSON 2
lordcarlos JDOM und entfernen von children XML & JSON 4
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
T jdom.jar als Relativer Pfad in Eclipse einbinden XML & JSON 4
sparrow JDom Element.getChild("Name") liefert null obwohl vorhanden XML & JSON 4
S XML, UTF-8, JDOM und Umlaute XML & JSON 3
E XML - JDOM - Bäume: was würdet ihr hier machen? XML & JSON 11
A JDOM: Wert schreiben bzw. ändern XML & JSON 6
T JDOM Bibiliothek XML & JSON 3
K JDOM vs. DOM, Schnittstellen XML & JSON 5
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
0x7F800000 jdom mit xml.transform inkompatibel, was soll ich nehmen? XML & JSON 2
T EXSD auslesen mit XPath und JDOM XML & JSON 8
A JDOM und Sonderzeichen < > XML & JSON 17
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
S Ampersand im Jdom-Element XML & JSON 2
N jdom - xslt-Verweis in .xml einfügen XML & JSON 3
S Jdom+java webstart XML & JSON 4
K html -> cyberneko -> xml -> jdom . XML & JSON 3
I JDom Text ändern XML & JSON 4
C jdom.Element nicht vorhanden? XML & JSON 4
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
C XPath in JDOM klappt nicht XML & JSON 2
S Harte Nuss mit XML und JDOM XML & JSON 2
H mit JDOM Verarbeitungsanweisungen und Kommentare auslesen XML & JSON 2
B jdom: getChildren() problem XML & JSON 4
T Bild in XML per JDOM XML & JSON 4
D JDOM erzeugt leere xmlns Attribute XML & JSON 4
T Elemente zählen mit JDOM in XML XML & JSON 7
B jdom document aus string erzeugen? XML & JSON 1
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
T XML mit JDOM auslesen => langsam? XML & JSON 7
B jdom outputter ohne attribute XML & JSON 2
C XML encoding UTF-8 und JDOM XML & JSON 4
P Probleme mit JDom . addContent(int index,Collection c) XML & JSON 2
R key aus xml lesen mittels jdom XML & JSON 5
M JDOM Element ohne Inhalt kopieren ? XML & JSON 3
X JDOM SAXBuilder Validationschema - Problem XML & JSON 8
G einzelne tags mit jdom auslesen XML & JSON 4
F XML ( ca. 280 MB) JDom & SAXBuilder lesen = OutOfMemoryE XML & JSON 4
K JDOM SAXBuilder einlesen XML & JSON 6
S Ausgabe "asXML" mit Jdom XML & JSON 2
B Element an bestimmter Stelle einfügen (JDOM) XML & JSON 8
G XML mit JDOM ausgeben [Klappe die 1Mio.ste] XML & JSON 2
F XML mit JDOM auslesen XML & JSON 2
D JDOM auf den PC machen XML & JSON 6
J JDOM Unicode XML & JSON 2
J schema-Validierung mit xerces und jdom: bug in java 1.4? XML & JSON 9
P JDOM Werte verändern XML & JSON 4
S OutOfMemory mit JDOM XML & JSON 6
S org.jdom.document in String umwandeln. XML & JSON 2
M ISO-8859-1 >> UTF-8 + JDOM + Verwirrung. XML & JSON 2
J [Newbie] [JDOM] Element aus XML entfernen klappt nicht XML & JSON 4
J JDOM mit XML-Schema XML & JSON 8
P HTML-Sting in JDOM XML & JSON 7
B JDOM && ObjectOutputStream XML & JSON 8
B Versionskonflikt bei JDOM XML & JSON 9
B JDom -- getChild() liefert nicht nachvollziehbar null XML & JSON 2
M JDOM parse Exception XML & JSON 3
G JDom encoding ändern XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben