Come leggere e scrivere file XML con codice

Come leggere e scrivere file XML con codice / Programmazione

Ti piacerebbe imparare a leggere e scrivere un file XML da java?

I file XML vengono utilizzati per vari scopi, inclusa la memorizzazione dei dati. Prima che JSON diventasse popolare, XML era il formato preferito per rappresentare, archiviare e trasportare i dati strutturati. Anche se la popolarità dell'XML è diminuita negli ultimi anni, potresti incontrarla occasionalmente, quindi è importante imparare come lavorarci dal codice.

Java Standard Edition (SE) 10 Concetti fondamentali di Java da imparare quando si inizia 10 Concetti fondamentali di Java da imparare quando si inizia Sia che si scriva una GUI, si sviluppi un software lato server o un'applicazione mobile con Android, l'apprendimento di Java servirà tu bene. Ecco alcuni concetti base di Java per aiutarti a iniziare. Ulteriori informazioni include il API Java per l'elaborazione XML (JAXP), che è un termine generico che copre la maggior parte degli aspetti dell'elaborazione XML. Questi includono:

  • DOM: Il Document Object Model include classi per lavorare con risorse XML come elemento, nodo, attributi, ecc. L'API DOM carica il documento XML completo in memoria per l'elaborazione, quindi non è molto adatto per lavorare con file XML di grandi dimensioni.
  • SAX: L'API semplice per XML è un algoritmo basato sugli eventi per la lettura di XML. Qui XML viene elaborato dagli eventi di attivazione trovati durante la lettura di XML. I requisiti di memoria per l'utilizzo di questo metodo sono bassi, ma lavorare con l'API è più complesso rispetto al lavoro con il DOM.
  • StAX: L'API Streaming per XML è un'aggiunta recente alle API XML e offre funzionalità di filtraggio, elaborazione e modifica di XML ad alte prestazioni. Mentre evita il caricamento dell'intero documento XML in memoria, fornisce un'architettura di tipo pull piuttosto che un'architettura basata sugli eventi, quindi l'applicazione è più facile da codificare e comprendere rispetto all'utilizzo dell'API SAX.

In questo articolo, usiamo il API DOM per dimostrare come leggere e scrivere file XML da java. Tratteremo le altre due API negli articoli futuri.

Un file XML di esempio

Ai fini di questo articolo, dimostriamo i concetti utilizzando il seguente esempio di XML, che può essere trovato qui:

   Gambardella, Matteo XML Developer's Guide Computer 44.95 2000/10/01 Uno sguardo approfondito alla creazione di applicazioni con XML.   Ralls, Kim... 

Leggere un file XML

Vediamo i passaggi di base necessari per leggere un file XML utilizzando l'API DOM.

Il primo passo è ottenere un'istanza di DocumentBuilder. Il builder viene utilizzato per analizzare i documenti XML. Per l'utilizzo di base, lo facciamo in questo modo:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder (); 

Ora possiamo caricare l'intero documento in memoria a partire dall'elemento radice XML. Nel nostro esempio, è il Catalogare elemento.

File file = ...; // File XML da leggere Document document = builder.parse (file); Catalogo degli elementi = document.getDocumentElement (); 

E questo è tutto, gente! L'API DOM per leggere un XML è davvero semplice. Ora hai accesso all'intero documento XML a partire dal suo elemento principale, Catalogare. Vediamo ora come lavorarci.

Utilizzo dell'API DOM

Ora che abbiamo la radice XML Elemento, possiamo usare l'API DOM per estrarre informazioni interessanti.

Prendi tutto libro figli dell'elemento radice e loop su di loro. Nota che getChildNodes () ritorna tutti bambini, inclusi testo, commenti, ecc. Per il nostro scopo, abbiamo bisogno solo degli elementi figli, quindi saltiamo sugli altri.

NodeList books = catalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; // work with the book Element here  

Come trovi un elemento figlio specifico, dato il genitore? Il seguente metodo statico restituisce il primo elemento corrispondente se trovato o null. Come puoi vedere, la procedura prevede di ottenere l'elenco dei nodi figlio e di eseguirne il looping individuando i nodi degli elementi con il nome specificato.

static private Node findFirstNamedElement (Node parent, String tagName) NodeList children = parent.getChildNodes (); for (int i = 0, in = children.getLength (); i < in ; i++)  Node child = children.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; if ( child.getNodeName().equals(tagName) ) return child;  return null;  

Si noti che l'API DOM considera il contenuto del testo all'interno di un elemento come un nodo di tipo separato TEXT_NODE. Inoltre, il contenuto del testo potrebbe essere suddiviso in più nodi di testo adiacenti. Quindi la seguente elaborazione speciale è richiesta per recuperare il contenuto del testo all'interno di un elemento.

statico privato String getCharacterData (nodo principale) StringBuilder text = new StringBuilder (); if (parent == null) restituisce text.toString (); NodeList children = parent.getChildNodes (); per (int k = 0, kn = children.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Armati di queste funzioni di convenienza, esaminiamo ora un codice per elencare alcune informazioni dal nostro XML di esempio. Vorremmo mostrare informazioni dettagliate per ogni libro, come sarebbe disponibile in un catalogo di libri.

NodeList books = catalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; ii++; String id = book.getAttribute("id"); String author = getCharacterData(findFirstNamedElement(child,"author")); String title = getCharacterData(findFirstNamedElement(child,"title")); String genre = getCharacterData(findFirstNamedElement(child,"genre")); String price = getCharacterData(findFirstNamedElement(child,"price")); String pubdate = getCharacterData(findFirstNamedElement(child,"pubdate")); String descr = getCharacterData(findFirstNamedElement(child,"description")); System.out.printf("%3d. book id = %s\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);  

Scrittura di output XML

Java fornisce il XML Tranform API per trasformare i dati XML. Usiamo questa API con il trasformazione dell'identità per generare output.

Ad esempio, aggiungiamo un nuovo libro elemento al catalogo di esempio presentato sopra. I dettagli del libro (come ad esempio autore, titolo, ecc.) può essere ottenuto esternamente, forse da un file di proprietà o da un database. Utilizziamo il seguente file delle proprietà per caricare i dati.

id = bk113 autore = Jane Austen title = Orgoglio e Prejudice genere = Romance price = 6.99 publish_date = 2010-04-01 description = "È una verità universalmente riconosciuta, che un singolo uomo in possesso di una buona fortuna deve essere in mancanza di una moglie." Così inizia Pride and Prejudice, l'arguta commedia di modi di Jane Austen - uno dei romanzi più popolari di tutti i tempi - che presenta sparring splendidamente civilizzato tra l'orgoglioso Mr. Darcy e la pregiudicata Elizabeth Bennet mentre giocano il loro corteggiamento coraggioso in una serie di intrighi settecenteschi da salotto. 

Il primo passo è analizzare il file XML esistente usando il metodo presentato sopra. Il codice è anche mostrato di seguito.

File file = ...; // File XML da leggere Document document = builder.parse (file); Catalogo degli elementi = document.getDocumentElement (); 

Carichiamo i dati dal file delle proprietà usando il Proprietà classe fornita con java. Il codice è abbastanza semplice e mostrato di seguito.

Puntelli di stringa File = ...; Proprietà props = new Properties (); provare (FileReader in = new FileReader (propsFile)) props.load (in);  

Una volta caricate le proprietà, recuperiamo i valori che vogliamo aggiungere dal file delle proprietà.

String id = props.getProperty ("id"); String author = props.getProperty ("author"); String title = props.getProperty ("title"); String genere = props.getProperty ("genere"); String price = props.getProperty ("price"); String publish_date = props.getProperty ("publish_date"); String descr = props.getProperty ("description"); 

Cerchiamo ora di creare un vuoto libro elemento.

Element book = document.createElement ("book"); book.setAttribute ("id", id); 

Aggiungere gli elementi secondari al libro è banale Per comodità, raccogliamo i nomi degli elementi richiesti in a Elenco e aggiungi i valori in un ciclo.

Elenco elnames = Arrays.asList ("author", "title", "genre", "price", "publish_date", "description"); for (String elname: elnames) Element el = document.createElement (elname); Testo text = document.createTextNode (props.getProperty (elname)); el.appendChild (testo); book.appendChild (EL);  catalog.appendChild (libro); 

E così è fatto. Il Catalogare l'elemento ora ha il nuovo libro elemento aggiunto. Tutto ciò che rimane ora è scrivere l'XML aggiornato.

Per scrivere l'XML, abbiamo bisogno di un'istanza di Trasformatore che viene creato come mostrato di seguito. Si noti che viene richiesto il rientro dell'XML di output mediante il comando setOutputProperty () metodo.

TransformerFactory tfact = TransformerFactory.newInstance (); Transformer tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "yes"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

Il passaggio finale nella generazione dell'output XML consiste nell'applicare la trasformazione. Il risultato appare sul flusso di output, System.out.

tform.transform (nuovo DOMSource (documento), nuovo StreamResult (System.out)); 

Per scrivere l'output direttamente su un file, utilizzare quanto segue.

tform.transform (nuovo DOMSource (documento), nuovo StreamResult (nuovo File ("output.xml"))); 

E questo avvolge questo articolo sulla lettura e scrittura di file XML usando l'API DOM.

Hai usato l'API DOM nelle tue applicazioni? Come ha funzionato? Per favore fateci sapere nei commenti qui sotto.

Scopri di più su: Java.