Com llegir i escriure fitxers XML amb codi

Com llegir i escriure fitxers XML amb codi

Voleu aprendre a llegir i escriure un fitxer XML des de Java?





Fitxers XML s’utilitzen per a diversos propòsits, inclòs l’emmagatzematge de dades. Abans que JSON es popularitzés, XML era el format preferit per representar, emmagatzemar i transportar dades estructurades. Tot i que la popularitat de XML ha disminuït en els darrers anys, és possible que el trobeu de tant en tant, per tant, és important aprendre a treballar-hi a partir del codi.





Java Standard Edition (SE) inclou el fitxer API Java per al processament XML (JAXP) , que és un terme general que cobreix la majoria dels aspectes del processament XML. Això inclou:





  • JUDICI: El model d’objectes de document inclou classes per treballar amb artefactes XML com ara elements, nodes, atributs, etc. L’API DOM carrega el document XML complet a la memòria per processar-lo, de manera que no és molt adequat per treballar amb fitxers XML grans.
  • SAX: L'API simple per a XML és un algorisme basat en esdeveniments per llegir XML. Aquí XML es processa activant esdeveniments trobats en llegir XML. Els requisits de memòria per utilitzar aquest mètode són baixos, però treballar amb l'API és més complex que treballar amb el DOM.
  • StAX: L'API Streaming per a XML és una addició recent a les API XML i proporciona filtratge, processament i modificació d'XML d'alt rendiment. Tot i que evita carregar tot el document XML a la memòria, proporciona una arquitectura de tipus pull en lloc d’una arquitectura basada en esdeveniments, de manera que l’aplicació és més fàcil de codificar i entendre que utilitzar l’API SAX.

En aquest article, fem servir el fitxer API DOM per demostrar com llegir i escriure fitxers XML des de Java. Cobrirem les altres dues API en futurs articles.

Un fitxer XML de mostra

Als efectes d’aquest article, demostrem els conceptes mitjançant l’exemple XML següent, que es pot trobar aquí :






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


Ralls, Kim
...

Lectura d’un fitxer XML

Vegem els passos bàsics necessaris per llegir un fitxer XML mitjançant l'API DOM.

El primer pas és obtenir una instància de DocumentBuilder . El constructor s’utilitza per analitzar documents XML. Per a un ús bàsic, ho fem així:





com puc restablir netflix al meu televisor
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Ara podem carregar tot el document a la memòria a partir de l'element arrel XML. En el nostre exemple, és el catàleg element.

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

I ja està, gent! L’API DOM per llegir un XML és realment senzilla. Ara teniu accés a tot el document XML a partir del seu element arrel, catàleg . Vegem ara com treballar-hi.





Utilitzant l’API DOM

Ara que tenim l’arrel XML Element , podem utilitzar l’API DOM per extreure nuggets d’informació interessants.

Aconsegueix tots els llibre fills de l’element arrel i sobre ells. Tingues en compte que getChildNodes () torna tot nens, inclosos textos, comentaris, etc. Per al nostre propòsit, només necessitem els elements infantils, de manera que ens saltem dels altres.

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
}

Com es pot trobar un element infantil específic, donat el pare o la mare? El següent mètode estàtic retorna el primer element coincident si es troba o és nul. Com podeu veure, el procediment consisteix a obtenir la llista de nodes secundaris i fer un bucle a través d’ells seleccionant nodes d’elements amb el nom especificat.

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

Tingueu en compte que l'API DOM tracta el contingut de text d'un element com un node de tipus independent TEXT_NODE . A més, el contingut del text es pot dividir en diversos nodes de text adjacents. Per tant, cal obtenir el següent processament especial per obtenir el contingut del text dins d’un element.

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

Armats amb aquestes funcions de conveniència, vegem ara algun codi per incloure informació del nostre XML d’exemple. Ens agradaria mostrar informació detallada per a cada llibre, com ara que estaria disponible en un catàleg de llibres.

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

Escriptura de la sortida XML

Java proporciona el fitxer API Tranform XML per transformar dades XML. Utilitzem aquesta API amb el transformació identitària per generar sortida.

Com a exemple, afegim-ne un de nou llibre element del catàleg de mostra presentat anteriorment. Els detalls del llibre (com ara autor , títol , etc) es poden obtenir externament, potser des d’un fitxer de propietats o una base de dades. Utilitzem el fitxer de propietats següent per carregar les dades.

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.

El primer pas és analitzar el fitxer XML existent mitjançant el mètode presentat anteriorment. El codi també es mostra a continuació.

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

Carregem les dades del fitxer de propietats mitjançant el fitxer Propietats classe proveïda de java. El codi és bastant simple i es mostra a continuació.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

Un cop carregades les propietats, recuperem els valors que volem afegir del fitxer de propietats.

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

Creem ara un buit llibre element.

es poden connectar auriculars sense fils a Xbox One
Element book = document.createElement('book');
book.setAttribute('id', id);

Afegint els elements fills al fitxer llibre és trivial. Per comoditat, recollim els noms d’elements necessaris a Llista i afegiu els valors en un bucle.

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

I així es fa. El catàleg ara l'element té el nou llibre element afegit. Ara només queda escriure l’XML actualitzat.

Per escriure l'XML, necessitem una instància de Transformador que es crea tal com es mostra a continuació. Tingueu en compte que sol·licitem el sagnat del XML de sortida mitjançant el fitxer setOutputProperty () mètode.

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

El darrer pas per generar la sortida XML és aplicar la transformació. El resultat apareix al flux de sortida, System.out .

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

Per escriure la sortida directament a un fitxer, utilitzeu el següent.

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

I això resumeix aquest article sobre la lectura i escriptura de fitxers XML mitjançant l'API DOM.

Heu utilitzat l'API DOM a les vostres aplicacions? Com va funcionar? Feu-nos-ho saber en els comentaris següents.

Compartir Compartir Tweet Correu electrònic Canon vs. Nikon: quina marca de càmera és millor?

Canon i Nikon són els dos noms més importants de la indústria de les càmeres. Però, quina marca ofereix la millor gamma de càmeres i objectius?

Llegiu a continuació
Temes relacionats
  • Programació
  • Java
Sobre l'autor Jay Sridhar(17 articles publicats) Més de Jay Sridhar

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us