Java >> Java tutorial >  >> Tag >> XML

Parsing af en XML-fil ved hjælp af StAX

1. Introduktion

I denne øvelse vil vi illustrere, hvordan man analyserer en XML-fil ved hjælp af StAX. Vi implementerer en simpel XML-parser og ser, hvordan den fungerer med et eksempel.

2. Parsing med StAX

StAX er et af de flere XML-biblioteker i Java. Det er et hukommelseseffektivt bibliotek inkluderet i JDK siden Java 6. StAX indlæser ikke hele XML i hukommelsen. I stedet trækker den data fra en strøm på en fremadrettet måde. Strømmen læses af en XMLEventReader objekt.

3. XMLEventReader Klasse

I StAX er ethvert start- eller sluttag en begivenhed. XMLEventReader læser en XML-fil som en strøm af begivenheder. Det giver også de nødvendige metoder til at parse XML. De vigtigste metoder er:

  • isStartElement() :kontrollerer, om den aktuelle begivenhed er et StartElement (start tag)
  • isEndElement() :kontrollerer, om den aktuelle begivenhed er et EndElement (slut-tag)
  • asCharacters() :returnerer den aktuelle hændelse som tegn
  • getName() :henter navnet på den aktuelle begivenhed
  • getAttributes() :returnerer en Iterator af den aktuelle begivenheds attributter

4. Implementering af en simpel XML-parser

Det er overflødigt at sige, at det første skridt til at parse en XML er at læse den. Vi har brug for en XMLInputFactory for at oprette en XMLEventReader for at læse vores fil:

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

Nu hvor XMLEventReader er klar, bevæger vi os fremad gennem strømmen med nextEvent() :

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

Dernæst skal vi først finde vores ønskede starttag:

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

Derfor kan vi læse attributterne og dataene:

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

Vi kan også tjekke, om vi har nået et sluttag:

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

5. Parsing Eksempel

For at få en bedre forståelse, lad os køre vores parser på en eksempel-XML-fil:

<?xml version="1.0" encoding="UTF-8"?>
<websites>
    <website url="https://baeldung.com">
        <name>Baeldung</name>
        <category>Online Courses</category>
        <status>Online</status>
    </website>
    <website url="http://example.com">
        <name>Example</name>
        <category>Examples</category>
        <status>Offline</status>
    </website>
    <website url="http://localhost:8080">
        <name>Localhost</name>
        <category>Tests</category>
        <status>Offline</status>
    </website>
</websites>

Lad os analysere XML og gemme alle data i en liste over entitetsobjekter kaldet websteder :

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);
        }
    }
}

For at få alle egenskaberne for hvert websted tjekker vi startElement.getName().getLocalPart() for hvert arrangement. Vi indstiller derefter den tilsvarende egenskab i overensstemmelse hermed.

Når vi når webstedets slutelement, ved vi, at vores enhed er komplet, så vi tilføjer entiteten til vores websteder liste.

6. Konklusion

I dette selvstudie lærte vi hvordan man analyserer en XML-fil ved hjælp af StAX-biblioteket .

Eksempel-XML-filen og den fulde parserkode er som altid tilgængelige på Github.


Java tag