XML vernünftig auslesen

kevin9r

Aktives Mitglied
Hallo,
ich arbeite derzeit an einem Programm, bei dem ich nicht um das auslesen einer XML Datei drum herum komme. Irgendwie bekomme ich es einfach nicht vernünftig hin mit Java eine XML Datei dynamisch auszulesen. Die rohen Daten habe ich in eine XML geschrieben, diese muss ich jetzt auslesen. Um folgende Datei geht es:
Code:
<?xml version="1.0" encoding="UTF-8"?>

-<bookings roomid="46587" >


-<booking id="5325193" action="">

<masterId>5325193</masterId>


-<group>

<booking id="5325202"/>

<booking id="5325208"/>

</group>

<roomId>46587</roomId>

Mich interessieren die zwei Daten in der <group> Klammer. Wie komme ich da dran. Bin jetzt seit 3 Tagen am rumprobieren aber finde einfach keinen Weg:
Java:
System.out.println("Root element " + doc.getDocumentElement().getElementsByTagName("group").item(0).getNodeName());

Vielen Dank!
 

krgewb

Top Contributor
Um eine XML-Datei zu laden:
Java:
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser parser = saxParserFactory.newSAXParser();
DefaultHandler myHandler = new MySAXHandler(mainWindow, xmlFile);
parser.parse(xmlFile, myHandler);

Wobei MySAXHandler eine eigene Klasse ist, die von Default Handler erbt.
Dort muss es u.a. solch eine Methode geben:
Java:
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
   ...
}

In "startElement" kannst du über qName abfragen und über atts.getLength() iterieren:
Java:
if (qName.equals("zteutf")) {
    for (int i = 0; i < atts.getLength(); i++) {
        if (atts.getQName(i).equals("irtdf")) {
            ...
        }
    }
}
 

Flown

Administrator
Mitarbeiter
Du könntest es mal mit einem ordentlichen XPath versuchen. Da das xml file nicht valide ist, kann ich dir da auch nicht näher helfen.
 

kevin9r

Aktives Mitglied
So sieht die XML Datei aus (hab diese jetzt irgendwo abgeschnitten, die Tags werde alle geschlossen):

Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookings bookid="5325193" propid="19034" roomid="46587">
    <booking action="" id="5325193">
        <masterId>5325193</masterId>
        <group>
            <booking id="5325202"/>
            <booking id="5325208"/>
        </group>
        <roomId>46587</roomId>

Das ist nicht valide? Wieso nicht? Bekomme die Daten als String, könnte noch etwas daran ändern bevor ich diese in die Datei schreibe. Dachte mir nur, dass wenn ich die Daten in eine XML Datei schreibe, ich diese schön bequem dynamisch über die Tags abrufen kann (wie in einer Datenbank). Deswegen habe ich den Weg über die XML gemacht.

Leider klappt das nicht so wie ich mir das wünsche.

@krgewb den Code verstehe ich nicht.
DefaultHandler myHandler = new MySAXHandler(mainWindow, xmlFile);

Was soll ich denn da übergeben?
 

kevin9r

Aktives Mitglied
Ja ich weiß, ich habe auch schon XML Dateien ausgelesen, und auch diese kann ich auslesen. Das Problem ist einfach, dass ich nicht weiß wie ich an die

<masterId>5325193</masterId>
<group>
<booking id="5325202"/>
<booking id="5325208"/>
</group>

zwei booking ids in der group komme.

Java:
doc.getDocumentElement().getElementsByTagName("group").item(0).getNodeName())

So komme ich schon mal an den Namen group. Aber ich weiß einfach nicht wie ich dann noch tiefer komme.
 

Flown

Administrator
Mitarbeiter
Mit XPath ist es ganz einfach durch ein XML zu navigieren (darum gibts die API auch).
Java:
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
        "<bookings bookid=\"5325193\" propid=\"19034\" roomid=\"46587\">\n" +
        "    <booking action=\"\" id=\"5325193\">\n" +
        "        <masterId>5325193</masterId>\n" +
        "        <group>\n" +
        "            <booking id=\"5325202\"/>\n" +
        "            <booking id=\"5325208\"/>\n" +
        "        </group>\n" +
        "        <roomId>46587</roomId>\n" +
        "    </booking>\n" +
        "</bookings>";
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();

StringWriter writer = new StringWriter();

try (StringReader stringReader = new StringReader(xml)) {
  Transformer transformer = TransformerFactory.newInstance().newTransformer();
  transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");

  NodeList evaluate = (NodeList) xPath.evaluate("//group/*", new InputSource(stringReader), XPathConstants.NODESET);
  for (int i = 0; i < evaluate.getLength(); i++) {
    transformer.transform(new DOMSource(evaluate.item(i)), new StreamResult(writer));
  }
} catch (XPathExpressionException | TransformerException e) {
  e.printStackTrace();
}

System.out.println(writer);
Transformer ist hier nur wegen der Ausgabe genutzt - in der for-Schleife kannst du dir die Nodes rauslesen.
 

kevin9r

Aktives Mitglied
Super! Ich danke dir. Dieses XPath ist ja genau das was ich suche, eine XML Datei, die ich wie eine Datenbank abfragen kann. Habe das jetzt geändert, dass der mir keine Datei schreibt, sondern ich sofort den String von der API übergebe. Jetzt kann ich mit deinem Code die ids herausziehen. Jetzt versuche ich aber auf die selbe Art die roomId zu erhalten. Ich nutze folgenden Befehl:
NodeList evaluate = (NodeList) xPath.evaluate("//roomId/text()", out, XPathConstants.NODESET);

Leider erhalte ich dann die Exception:
Code:
javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(Unknown Source)
    at keysystem.Beds24.getRoomid(Beds24.java:276)
    at keysystem.Beds24.<init>(Beds24.java:127)
    at keysystem.Keysystem.main(Keysystem.java:20)
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source)
    ... 6 more
---------
java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source)
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(Unknown Source)
    at keysystem.Beds24.getRoomid(Beds24.java:276)
    at keysystem.Beds24.<init>(Beds24.java:127)
    at keysystem.Keysystem.main(Keysystem.java:20)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(Unknown Source)
    at keysystem.Beds24.getRoomid(Beds24.java:276)
    at keysystem.Beds24.<init>(Beds24.java:127)
    at keysystem.Keysystem.main(Keysystem.java:20)
Caused by: javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(Unknown Source)
    ... 4 more
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source)
    ... 6 more

Hast du eine Idee voran das liegt.

Vielen Dank nochmal für den super Tipp!
 

Flown

Administrator
Mitarbeiter
Naja wie wärs denn mit:
Java:
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
        "<bookings bookid=\"5325193\" propid=\"19034\" roomid=\"46587\">\n" +
        "    <booking action=\"\" id=\"5325193\">\n" +
        "        <masterId>5325193</masterId>\n" +
        "        <group>\n" +
        "            <booking id=\"5325202\"/>\n" +
        "            <booking id=\"5325208\"/>\n" +
        "        </group>\n" +
        "        <roomId>46587</roomId>\n" +
        "    </booking>\n" +
        "</bookings>";
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();

try (StringReader stringReader = new StringReader(xml)) {
  String evaluate = (String) xPath.evaluate("//roomId/text()", new InputSource(stringReader), XPathConstants.STRING);
  System.out.println(evaluate);
} catch (XPathExpressionException e) {
  e.printStackTrace();
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JSON auslesen und Labels in GUI verwenden XML & JSON 13
M json page 2 auslesen XML & JSON 1
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
Kanda Sorata Eingabefelder von Excel Dateien auslesen XML & JSON 1
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
H SOAPBody auslesen XML & JSON 0
B XML auslesen, benötige Hilfe XML & JSON 13
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
W XML einlesen und Attribute auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
M Json auslesen XML & JSON 7
K XML Auslesen, wie abspeichern? XML & JSON 32
D Attribute aus XML Auslesen XML & JSON 5
W Kindelemente mit JDOM eines bestimmten Attributes auslesen XML & JSON 6
R Apache POI: Gezieltes Auslesen von Zellen XML & JSON 2
S XMl auslesen:@ output ? XML & JSON 1
Z Verschachtelte XML auslesen XML & JSON 3
C JDOM: Value ohne Unterelemente auslesen XML & JSON 1
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
I XML IDs auslesen, erst X dann Y XML & JSON 2
S XML - rekursives auslesen - Zeilenumbruch als NodeValue? XML & JSON 3
O XML richtig auslesen XML & JSON 7
Kenan89 XML Tag-ID auslesen mit getElementById XML & JSON 2
J Excel zeilenweise auslesen - POI XML & JSON 5
J Excel Zellen auslesen - automatischer Stopp bei leerer Zelle XML & JSON 2
I XPath Namensräume und auslesen einzelner Knoten XML & JSON 3
S SVG auslesen und darstellen XML & JSON 5
G xpath: in Kindelement zwei Attribut-Werte auslesen XML & JSON 2
G xpath: Inhalt eines Kindelements auslesen XML & JSON 2
1 Html tabelle auslesen??? XML & JSON 6
JanUlrich Tabelle auslesen XML & JSON 2
A XSl mit JDom auslesen XML & JSON 1
J Anzahl der Elemente in einem XML-Dokument auslesen XML & JSON 7
K XMl auslesen XML & JSON 19
P Poi /XSSF : Excel-Tabelle auslesen XML & JSON 2
S XSD-Datei zulässige Werte auslesen XML & JSON 3
D rss auslesen XML & JSON 2
S Attribute von Elementen auslesen mit XPath XML & JSON 2
M Große Datei auslesen/in dieser suchen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
N Google Wetter XML (nur current_condition) auslesen mit Java XML & JSON 15
J Dateinamen beim Start auslesen XML & JSON 8
eQuest XML Jaxen Attribute auslesen XML & JSON 2
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
P jdom XML-Encoding auslesen XML & JSON 12
H XML Attribute auslesen XML & JSON 5
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
L XML Daten auslesen und in Tabelle (Array) speichern XML & JSON 1
L XML Dokument auslesen funktioniert nicht richtig XML & JSON 2
C Attributwert aus XML auslesen XML & JSON 10
H XML String auslesen XML & JSON 4
E XML Knoten mit rekursiver Methode auslesen XML & JSON 3
S Dom Baum auslesen XML & JSON 12
J Properties auslesen (Jar) XML & JSON 1
S auslesen XML & JSON 9
Z XML auslesen, Elemente daraus entfernen und als neue XML zurückgeben XML & JSON 2
M XMI-Datei auslesen XML & JSON 4
T EXSD auslesen mit XPath und JDOM XML & JSON 8
M XML-Datum als Referenz auf Objekt-Variable auslesen XML & JSON 5
Spot84 xmi auslesen XML & JSON 20
G Welche Klassen zum erzeugen/auslesen eines XML Files verwend XML & JSON 9
G Xml File schematisch auslesen XML & JSON 2
P NullPointerException beim Auslesen XML & JSON 8
N XML-String in MIDP auslesen XML & JSON 3
H mit JDOM Verarbeitungsanweisungen und Kommentare auslesen XML & JSON 2
K XML auslesen (simpel) XML & JSON 10
X XML File auslesen/parsen u. in ne Hashmap speichern XML & JSON 2
HeRaider Definitionen auslesen und Encoding XML & JSON 3
A SVG Datei auslesen und Batik XML & JSON 1
M XML werte auslesen ! XML & JSON 3
M XML File während Applet-Start auslesen? XML & JSON 10
L SAXReader , auslesen bis zum bestimmten knoten! XML & JSON 3
W XML DomDocument als String auslesen XML & JSON 2
T XML mit JDOM auslesen => langsam? XML & JSON 7
N XML Datei auslesen / Validierung XML & JSON 4
G einzelne tags mit jdom auslesen XML & JSON 4
F XML mit JDOM auslesen XML & JSON 2
N bestimmtes Element auslesen - ich verzweifel XML & JSON 3
A XML-File auslesen, alles leer? XML & JSON 2
H Elemente eines Node auslesen XML & JSON 2
H Xpath kindelemente auslesen XML & JSON 2
P [Solved] XSL: Element-Variable auslesen XML & JSON 2
A Internetinhalte auslesen und in einem XML-File speichern XML & JSON 4
A Auslesen einer XML Datei XML & JSON 58
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
M Aus DTD's Klassen auslesen XML & JSON 2
M *.group() in File auslesen XML & JSON 4
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
R Problem beim Auslesen von Attributen XML & JSON 4
G Aus XML-Datei auslesen und als Java-Dialog ausgeben XML & JSON 3
D Eingehende XML Files Auslesen XML & JSON 3
T Prob: Auslesen XML File mit JDOM XML & JSON 2
W XML-Document auslesen XML & JSON 2
T Mehrere gleichnamige Unterelemente auslesen XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben