Come leggere e scrivere file XML con il codice

Come leggere e scrivere file XML con il codice

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





File XML sono utilizzati per una varietà di scopi, inclusa la memorizzazione dei dati. Prima che JSON diventasse popolare, XML era il formato preferito per rappresentare, archiviare e trasportare dati strutturati. Anche se la popolarità di XML è diminuita negli ultimi anni, potresti incontrarlo occasionalmente, quindi è importante imparare come lavorarci dal codice.





Java Standard Edition (SE) 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:





  • GIUDIZIO: Il Document Object Model include classi per lavorare con artefatti XML come elementi, nodi, 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 guidato dagli eventi per la lettura di XML. Qui l'XML viene elaborato attivando gli eventi rilevati durante la lettura dell'XML. I requisiti di memoria per l'utilizzo di questo metodo sono bassi, ma lavorare con l'API è più complesso rispetto a lavorare con il DOM.
  • StAX: L'API Streaming per XML è un'aggiunta recente alle API XML e fornisce il filtraggio, l'elaborazione e la modifica di XML ad alte prestazioni. Sebbene eviti di caricare l'intero documento XML in memoria, fornisce un'architettura di tipo pull piuttosto che un'architettura basata su 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 in articoli futuri.

Un file XML di esempio

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






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Lettura di un file XML

Diamo un'occhiata ai 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'uso di base, lo facciamo in questo modo:





come ridurre le dimensioni del documento scansionato pdf
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 = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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





Utilizzo dell'API DOM

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

Ottieni tutti i prenotare figli dell'elemento radice e passarci sopra. Notare che getChildNodes() ritorna Tutti bambini, inclusi testo, commenti, ecc. Per il nostro scopo, abbiamo bisogno solo degli elementi figlio, quindi saltiamo gli altri.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; 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 figli e di scorrere attraverso di essi selezionando i nodi dell'elemento con il nome specificato.

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

Nota che l'API DOM tratta il contenuto di 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 è necessaria la seguente elaborazione speciale per recuperare il contenuto del testo all'interno di un elemento.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Armati di queste comode funzioni, esaminiamo ora del 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 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
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Scrittura dell'output XML

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

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

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

Il primo passaggio consiste nell'analizzare il file XML esistente utilizzando il metodo presentato sopra. Il codice è anche mostrato di seguito.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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

String propsFile = ...;
Properties props = new Properties();
try (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 genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Creiamo ora un vuoto prenotare elemento.

come abbassare la luminosità dello schermo windows 10
Element book = document.createElement('book');
book.setAttribute('id', id);

Aggiunta degli elementi figlio al prenotare è banale. Per comodità, raccogliamo i nomi degli elementi richiesti in a Elenco e aggiungere i valori in un ciclo.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

Ed è così che si fa. Il Catalogare l'elemento ora ha il nuovo prenotare elemento aggiunto. Non resta che scrivere l'XML aggiornato.

Per scrivere l'XML, abbiamo bisogno di un'istanza di Trasformatore che viene creato come mostrato di seguito. Nota che richiediamo il rientro dell'XML di output utilizzando il setOutputProperty() metodo.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

Il passaggio finale nella generazione dell'output XML consiste nell'applicare la trasformazione. Il risultato viene visualizzato nel flusso di output, Sistema.out .

tform.transform(new DOMSource(document), new StreamResult(System.out));

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

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

E questo conclude questo articolo sulla lettura e la scrittura di file XML utilizzando l'API DOM.

Hai utilizzato l'API DOM nelle tue applicazioni? Come si è comportato? Fatecelo sapere nei commenti qui sotto.

Condividere Condividere Tweet E-mail Canon vs Nikon: quale marca di fotocamere è migliore?

Canon e Nikon sono i due più grandi nomi nel settore delle fotocamere. Ma quale marca offre la migliore gamma di fotocamere e obiettivi?

Leggi Avanti
Argomenti correlati
  • Programmazione
  • Giava
Circa l'autore Jay Sridhar(17 Articoli Pubblicati) Altro da Jay Sridhar

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti