Een XML-bestand parseren met StAX

1. Inleiding

In deze tutorial laten we zien hoe je een XML-bestand kunt parseren met StAX. We zullen een eenvoudige XML-parser implementeren en zien hoe het werkt met een voorbeeld.

2. Ontleden met StAX

StAX is een van de vele XML-bibliotheken in Java. Het is een geheugenefficiënte bibliotheek die sinds Java 6 in de JDK is opgenomen. StAX laadt niet de volledige XML in het geheugen. In plaats daarvan haalt het gegevens uit een stream op een forward-only manier. De stream wordt gelezen door een XMLEventReader voorwerp.

3. XMLEventReader Klasse

In StAX is elke start- of eindtag een gebeurtenis. XMLEventReader leest een XML-bestand als een stroom gebeurtenissen. Het biedt ook de methoden die nodig zijn om de XML te ontleden. De belangrijkste methoden zijn:

  • isStartElement (): controleert of de huidige gebeurtenis een StartElement (start tag)
  • isEndElement (): controleert of de huidige gebeurtenis een EndElement (eindtag)
  • asTekens (): geeft de huidige gebeurtenis terug als tekens
  • getName (): haalt de naam van de huidige gebeurtenis op
  • getAttributes (): geeft een Iterator van de kenmerken van de huidige gebeurtenis

4. Implementatie van een eenvoudige XML-parser

Onnodig te zeggen dat de eerste stap om een ​​XML te ontleden, is om deze te lezen. We hebben een XMLInputFactory om een XMLEventReader voor het lezen van ons bestand:

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance (); XMLEventReader-lezer = xmlInputFactory.createXMLEventReader (nieuwe FileInputStream (pad));

Nu dat de XMLEventReader is klaar, we gaan voorwaarts door de stroom met volgende gebeurtenis():

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

Vervolgens moeten we eerst onze gewenste start-tag vinden:

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

Bijgevolg kunnen we de attributen en gegevens lezen:

String url = startElement.getAttributeByName (nieuwe QName ("url")). GetValue (); String naam = nextEvent.asCharacters (). GetData ();

We kunnen ook controleren of we een eindtag hebben bereikt:

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

5. Voorbeeld van ontleden

Om een ​​beter begrip te krijgen, laten we onze parser uitvoeren op een XML-voorbeeldbestand:

   Baeldung Online Cursussen Online Voorbeeld Voorbeelden Offline Localhost Tests Offline 

Laten we de XML ontleden en alle gegevens opslaan in een lijst met entiteitsobjecten met de naam websites:

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

Om alle eigenschappen van elke website te krijgen, controleren we startElement.getName (). getLocalPart () voor elk evenement. Vervolgens stellen we de bijbehorende eigenschap dienovereenkomstig in.

Wanneer we het eindelement van de website bereiken, weten we dat onze entiteit compleet is, dus voegen we de entiteit toe aan ons websites lijst.

6. Conclusie

In deze tutorial hebben we geleerd hoe een XML-bestand te ontleden met behulp van de StAX-bibliotheek.

Het XML-voorbeeldbestand en de volledige parsercode zijn, zoals altijd, beschikbaar op Github.


$config[zx-auto] not found$config[zx-overlay] not found