Analysieren einer XML-Datei mit StAX

1. Einleitung

In diesem Tutorial wird veranschaulicht, wie eine XML-Datei mit StAX analysiert wird. Wir werden einen einfachen XML-Parser implementieren und anhand eines Beispiels sehen, wie es funktioniert.

2. Parsen mit StAX

StAX ist eine der mehreren XML-Bibliotheken in Java. Es ist eine speichereffiziente Bibliothek, die seit Java 6 im JDK enthalten ist. StAX lädt nicht das gesamte XML in den Speicher. Stattdessen werden Daten nur vorwärts aus einem Stream abgerufen. Der Stream wird von einem XMLEventReader- Objekt gelesen .

3. XMLEventReader- Klasse

In StAX ist jedes Start- oder Endtag ein Ereignis. XMLEventReader liest eine XML-Datei als Ereignisstrom. Es bietet auch die Methoden, die zum Parsen des XML erforderlich sind. Die wichtigsten Methoden sind:

  • isStartElement () : Überprüft, ob das aktuelle Ereignis ein StartElement (Start-Tag) ist.
  • isEndElement () : Überprüft, ob das aktuelle Ereignis ein EndElement (End-Tag) ist.
  • asCharacters () : Gibt das aktuelle Ereignis als Zeichen zurück
  • getName () : Ruft den Namen des aktuellen Ereignisses ab
  • getAttributes () : Gibt einen Iterator der Attribute des aktuellen Ereignisses zurück

4. Implementieren eines einfachen XML-Parsers

Der erste Schritt zum Parsen eines XML-Codes besteht natürlich darin, es zu lesen. Wir benötigen eine XMLInputFactory , um einen XMLEventReader zum Lesen unserer Datei zu erstellen :

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path));

Nachdem der XMLEventReader bereit ist, bewegen wir uns mit nextEvent () vorwärts durch den Stream :

while (reader.hasNext()) { XMLEvent nextEvent = reader.nextEvent(); }

Als nächstes müssen wir zuerst unser gewünschtes Start-Tag finden:

if (nextEvent.isStartElement()) { StartElement startElement = nextEvent.asStartElement(); if (startElement.getName().getLocalPart().equals("desired")) { //... } }

Folglich können wir die Attribute und Daten lesen:

String url = startElement.getAttributeByName(new QName("url")).getValue(); String name = nextEvent.asCharacters().getData();

Wir können auch überprüfen, ob wir ein End-Tag erreicht haben:

if (nextEvent.isEndElement()) { EndElement endElement = nextEvent.asEndElement(); }

5. Analysebeispiel

Lassen Sie uns zum besseren Verständnis unseren Parser für eine XML-Beispieldatei ausführen:

   Baeldung Online Courses Online   Example Examples Offline   Localhost Tests Offline  

Lassen Sie uns das XML analysieren und alle Daten in einer Liste von Entitätsobjekten speichern, die als Websites bezeichnet werden :

while (reader.hasNext()) { XMLEvent nextEvent = reader.nextEvent(); if (nextEvent.isStartElement()) { StartElement startElement = nextEvent.asStartElement(); switch (startElement.getName().getLocalPart()) { case "website": website = new WebSite(); Attribute url = startElement.getAttributeByName(new QName("url")); if (url != null) { website.setUrl(url.getValue()); } break; case "name": nextEvent = reader.nextEvent(); website.setName(nextEvent.asCharacters().getData()); break; case "category": nextEvent = reader.nextEvent(); website.setCategory(nextEvent.asCharacters().getData()); break; case "status": nextEvent = reader.nextEvent(); website.setStatus(nextEvent.asCharacters().getData()); break; } } if (nextEvent.isEndElement()) { EndElement endElement = nextEvent.asEndElement(); if (endElement.getName().getLocalPart().equals("website")) { websites.add(website); } } }

Um alle Eigenschaften jeder Website abzurufen , überprüfen wir startElement.getName (). GetLocalPart () für jedes Ereignis. Wir setzen dann die entsprechende Eigenschaft entsprechend.

Wenn wir das Endelement der Website erreichen, wissen wir, dass unsere Entität vollständig ist, und fügen sie daher unserer Website- Liste hinzu.

6. Fazit

In diesem Tutorial haben wir gelernt, wie eine XML-Datei mithilfe der StAX-Bibliothek analysiert wird .

Die Beispiel-XML-Datei und der vollständige Parser-Code sind wie immer auf Github verfügbar.