Hur man läser och skriver XML -filer med kod

Hur man läser och skriver XML -filer med kod

Vill du lära dig att läsa och skriva en XML -fil från java?





XML -filer används för en mängd olika ändamål, inklusive lagring av data. Innan JSON blev populärt var XML det föredragna formatet för att representera, lagra och transportera strukturerad data. Även om populariteten för XML har minskat de senaste åren, kan du stöta på det ibland så det är viktigt att lära sig hur man arbetar med det från kod.





Java Standard Edition (SE) inkluderar Java API för XML -bearbetning (JAXP) , som är en paraplyterm som täcker de flesta aspekterna av XML -bearbetning. Dessa inkluderar:





  • DOM: Dokumentobjektmodellen innehåller klasser för att arbeta med XML -artefakter som element, nod, attribut etc. DOM API laddar hela XML -dokumentet i minnet för bearbetning, så det är inte särskilt lämpligt för arbete med stora XML -filer.
  • SAX: Simple API för XML är en händelsestyrd algoritm för att läsa XML. Här bearbetas XML genom att avfyra händelser som hittas vid läsning av XML. Minneskraven för att använda denna metod är låga, men att arbeta med API är mer komplext än att arbeta med DOM.
  • StAX: Streaming API för XML är ett nytt tillägg till XML-API: erna och ger högpresterande strömfiltrering, bearbetning och modifiering av XML. Även om det undviker att ladda hela XML-dokumentet i minnet, ger det en pull-type arkitektur snarare än en händelsedriven arkitektur, så applikationen är lättare att koda och förstå än att använda SAX API.

I den här artikeln använder vi DOM API för att visa hur man läser och skriver XML -filer från java. Vi kommer att täcka de två andra API: erna i framtida artiklar.

Ett exempel på XML -fil

För denna artikel demonstrerar vi begreppen med hjälp av följande XML -exempel, som kan hittas här :






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


Ralls, Kim
...

Läser en XML -fil

Låt oss titta på de grundläggande stegen som krävs för att läsa en XML -fil med DOM API.

Det första steget är att få en instans av DocumentBuilder . Byggaren används för att analysera XML -dokument. För grundläggande användning gör vi det så här:





hur man använder tl
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Vi kan nu ladda hela dokumentet i minnet från XML -rotelementet. I vårt exempel är det katalog element.

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

Och det är det, folk! DOM API för att läsa en XML är verkligen enkel. Du har nu tillgång till hela XML -dokumentet från dess rotelement, katalog . Låt oss nu se hur vi arbetar med det.





Använda DOM API

Nu när vi har XML -roten Element , kan vi använda DOM API för att extrahera intressanta nuggets av information.

Få allt bok barn till rotelementet och slingra över dem. Anteckna det getChildNodes () returnerar Allt barn, inklusive text, kommentarer etc. För vårt syfte behöver vi bara barnelementen, så vi hoppar över de andra.

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
}

Hur hittar du ett specifikt barnelement, med tanke på föräldern? Följande statisk metod returnerar det första matchande elementet om det hittas eller null. Som du kan se innebär proceduren att få listan över barnnoder och gå igenom dem genom att plocka ut elementnoder med det angivna namnet.

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

Observera att DOM API behandlar textinnehåll i ett element som en separat typ av nod TEXT_NODE . Dessutom kan textinnehållet delas upp i flera angränsande textnoder. Så följande specialbehandling krävs för att hämta textinnehållet i ett 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();
}

Beväpnad med dessa bekvämlighetsfunktioner, låt oss nu titta på någon kod för att lista ut lite information från vårt exempel -XML. Vi skulle vilja visa detaljerad information för varje bok, som skulle finnas tillgänglig i en bokkatalog.

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

Skriva XML -utdata

Java tillhandahåller XML Tranform API för att transformera XML -data. Vi använder detta API med identitetstransform för att generera utdata.

Som ett exempel, låt oss lägga till en ny bok element i provkatalogen som presenteras ovan. Detaljerna i boken (t.ex. författare , titel , etc) kan erhållas externt, kanske från en egenskapsfil eller en databas. Vi använder följande egenskapsfil för att ladda data.

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.

Det första steget är att analysera den befintliga XML -filen med metoden som presenteras ovan. Koden visas också nedan.

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

Vi laddar data från egenskapsfilen med Egenskaper klass försedd med java. Koden är ganska enkel och visas nedan.

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

När egenskaperna har laddats hämtar vi de värden som vi vill lägga till från egenskapsfilen.

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

Låt oss nu skapa en tom bok element.

hur man gör en startbar cd
Element book = document.createElement('book');
book.setAttribute('id', id);

Lägga till barnelementen till bok är trivialt. För enkelhets skull samlar vi de obligatoriska elementnamnen i a Lista och lägg till värdena i en loop.

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

Och det är så det görs. De katalog elementet har nu det nya bok element tillagt. Nu återstår bara att skriva ut den uppdaterade XML -filen.

För att skriva XML behöver vi en instans av Transformator som skapas enligt nedan. Observera att vi begär indragning av utgångs -XML med setOutputProperty () metod.

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

Det sista steget i att generera XML -utdata är att tillämpa transformationen. Resultatet visas på utmatningsströmmen, System.out .

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

För att skriva utmatningen direkt till en fil, använd följande.

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

Och det avslutar denna artikel om att läsa och skriva XML -filer med DOM API.

Har du använt DOM API i dina applikationer? Hur gick det? Meddela oss i kommentarerna nedan.

Dela med sig Dela med sig Tweet E-post Canon vs Nikon: Vilket kameramärke är bättre?

Canon och Nikon är de två största namnen i kameraindustrin. Men vilket märke erbjuder den bättre sortimentet av kameror och objektiv?

Läs Nästa
Relaterade ämnen
  • Programmering
  • Java
Om författaren Jay Sridhar(17 artiklar publicerade) Mer från Jay Sridhar

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera