Analisi di un file XML utilizzando StAX

1. Introduzione

In questo tutorial, illustreremo come analizzare un file XML utilizzando StAX. Implementeremo un semplice parser XML e vedremo come funziona con un esempio.

2. Analisi con StAX

StAX è una delle numerose librerie XML in Java. È una libreria efficiente in termini di memoria inclusa nel JDK a partire da Java 6. StAX non carica l'intero XML in memoria. Invece, estrae i dati da un flusso solo in avanti. Il flusso viene letto da un oggetto XMLEventReader .

3. Classe XMLEventReader

In StAX, qualsiasi tag di inizio o tag di fine è un evento. XMLEventReader legge un file XML come flusso di eventi. Fornisce inoltre i metodi necessari per analizzare l'XML. I metodi più importanti sono:

  • isStartElement () : controlla se l'evento corrente è uno StartElement (tag di inizio)
  • isEndElement () : controlla se l'evento corrente è un EndElement (tag di fine)
  • asCharacters () : restituisce l'evento corrente come caratteri
  • getName () : ottiene il nome dell'evento corrente
  • getAttributes () : restituisce un Iteratore degli attributi dell'evento corrente

4. Implementazione di un semplice parser XML

Inutile dire che il primo passo per analizzare un XML è leggerlo. Abbiamo bisogno di un XMLInputFactory per creare un XMLEventReader per leggere il nostro file:

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

Ora che XMLEventReader è pronto, procediamo nello stream con nextEvent () :

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

Successivamente, dobbiamo prima trovare il tag di inizio desiderato:

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

Di conseguenza, possiamo leggere gli attributi e i dati:

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

Possiamo anche verificare se abbiamo raggiunto un tag di fine:

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

5. Esempio di analisi

Per avere una migliore comprensione, eseguiamo il nostro parser su un file XML di esempio:

   Baeldung Online Courses Online   Example Examples Offline   Localhost Tests Offline  

Analizziamo l'XML e archiviamo tutti i dati in un elenco di oggetti entità chiamati siti Web :

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

Per ottenere tutte le proprietà di ogni sito web, controlliamo startElement.getName (). GetLocalPart () per ogni evento. Quindi impostiamo di conseguenza la proprietà corrispondente.

Quando raggiungiamo l'elemento finale del sito Web, sappiamo che la nostra entità è completa, quindi aggiungiamo l'entità all'elenco dei nostri siti Web .

6. Conclusione

In questo tutorial, abbiamo imparato come analizzare un file XML utilizzando la libreria StAX .

Il file XML di esempio e il codice completo del parser sono disponibili, come sempre, su Github.