Raščlanjivanje XML datoteke pomoću StAX-a

1. Uvod

U ovom uputstvu ilustrirat ćemo kako raščlaniti XML datoteku pomoću StAX-a. Implementirat ćemo jednostavan XML parser i na primjeru ćemo vidjeti kako to funkcionira.

2. Raščlanjivanje sa StAX-om

StAX je jedna od nekoliko XML knjižnica u Javi. To je memorijski učinkovita knjižnica uključena u JDK od Jave 6. StAX ne učitava cijeli XML u memoriju. Umjesto toga, povlači podatke iz struje samo naprijed. Tok čita an XMLEventReader objekt.

3. XMLEventReader Razred

U StAX-u je svaka početna ili završna oznaka događaj. XMLEventReader čita XML datoteku kao tok događaja. Također pruža metode potrebne za raščlanjivanje XML-a. Najvažnije metode su:

  • isStartElement (): provjerava je li trenutni događaj StartElement (početna oznaka)
  • isEndElement (): provjerava je li trenutni događaj EndElement (završna oznaka)
  • asCharacters (): vraća trenutni događaj kao znakove
  • getName (): dobiva ime trenutnog događaja
  • getAttributes (): vraća an Iterator atributa trenutnog događaja

4. Implementacija jednostavnog XML parsera

Nepotrebno je reći da je prvi korak za raščlanjivanje XML-a čitanje. Treba nam XMLInputFactory stvoriti XMLEventReader za čitanje naše datoteke:

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance (); Čitač XMLEventReader = xmlInputFactory.createXMLEventReader (novi FileInputStream (put));

Sad kad je XMLEventReader je spremno, krećemo naprijed kroz potok sa nextEvent ():

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

Dalje, prvo moramo pronaći željenu početnu oznaku:

if (nextEvent.isStartElement ()) {StartElement startElement = nextEvent.asStartElement (); if (startElement.getName (). getLocalPart (). jednako ("željeno")) {// ...}}

Stoga možemo čitati atribute i podatke:

Niz url = startElement.getAttributeByName (novo QName ("url")). GetValue (); Naziv niza = nextEvent.asCharacters (). GetData ();

Također možemo provjeriti jesmo li dosegli završnu oznaku:

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

5. Primjer raščlanjivanja

Da bismo bolje razumjeli, pokrenimo naš parser na uzorku XML datoteke:

   Baeldung internetski tečajevi Primjeri na mreži Primjeri izvan mreže Localhost testovi izvan mreže 

Analizirajmo XML i pohranimo sve podatke na popis entiteta koji se nazivaju web stranice:

while (reader.hasNext ()) {XMLEvent nextEvent = reader.nextEvent (); if (nextEvent.isStartElement ()) {StartElement startElement = nextEvent.asStartElement (); switch (startElement.getName (). getLocalPart ()) {case "web stranica": web stranica = novo WebSite (); Atribut url = startElement.getAttributeByName (novo QName ("url")); if (url! = null) {website.setUrl (url.getValue ()); } pauza; slučaj "ime": nextEvent = čitač.nextEvent (); website.setName (nextEvent.asCharacters (). getData ()); pauza; slučaj "kategorija": nextEvent = čitač.nextEvent (); website.setCategory (nextEvent.asCharacters (). getData ()); pauza; slučaj "status": nextEvent = čitač.nextEvent (); website.setStatus (nextEvent.asCharacters (). getData ()); pauza; }} if (nextEvent.isEndElement ()) {EndElement endElement = nextEvent.asEndElement (); if (endElement.getName (). getLocalPart (). equals ("web stranica")) {web stranice.add (web stranica); }}}

Da bismo dobili sva svojstva svake web stranice, provjeravamo startElement.getName (). getLocalPart () za svaki događaj. Zatim u skladu s tim postavljamo odgovarajuće svojstvo.

Kad dođemo do završnog elementa web stranice, znamo da je naša cjelina cjelovita, pa je dodajemo u našu web stranice popis.

6. Zaključak

U ovom uputstvu smo naučili kako raščlaniti XML datoteku pomoću StAX knjižnice.

Primjer XML datoteke i puni kod za raščlanjivanje dostupni su, kao i uvijek, na Githubu.