Hvordan lese og skrive XML -filer med kode

Hvordan lese og skrive XML -filer med kode

Vil du lære å lese og skrive en XML -fil fra java?





XML -filer brukes til en rekke formål, inkludert lagring av data. Før JSON ble populær, var XML det foretrukne formatet for å representere, lagre og transportere strukturerte data. Selv om populariteten til XML har avtatt de siste årene, kan du støte på det av og til, så det er viktig å lære å jobbe med det fra kode.





Java Standard Edition (SE) inkluderer Java API for XML Processing (JAXP) , som er et paraplybegrep som dekker de fleste aspekter ved XML -behandling. Disse inkluderer:





  • DØMMEKRAFT: Dokumentobjektmodellen inneholder klasser for arbeid med XML -artefakter som element, node, attributter osv. DOM API laster det komplette XML -dokumentet inn i minnet for behandling, så det er lite egnet for arbeid med store XML -filer.
  • SAX: Simple API for XML er en hendelsesdrevet algoritme for lesing av XML. Her behandles XML ved å skyte hendelser som ble funnet ved lesing av XML. Minnekravene for å bruke denne metoden er lave, men det er mer komplekst å jobbe med API enn å arbeide med DOM.
  • StAX: Streaming API for XML er et nylig tillegg til XML-API-ene og gir strømfiltrering, behandling og modifisering av XML med høy ytelse. Selv om det unngår å laste hele XML-dokumentet i minnet, gir det en pull-type arkitektur i stedet for en hendelsesdrevet arkitektur, så programmet er lettere å kode og forstå enn å bruke SAX API.

I denne artikkelen bruker vi DOM API for å demonstrere hvordan du leser og skriver XML -filer fra java. Vi vil dekke de to andre API -ene i fremtidige artikler.

Eksempel på en XML -fil

I denne artikkelen demonstrerer vi konseptene ved å bruke følgende eksempel -XML, som du finner her :






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


Ralls, Kim
...

Lese en XML -fil

La oss se på de grunnleggende trinnene som kreves for å lese en XML -fil ved hjelp av DOM API.

Det første trinnet er å få en forekomst av DocumentBuilder . Byggmesteren brukes til å analysere XML -dokumenter. For grunnleggende bruk gjør vi det slik:





Hvordan fikse en hacket Facebook -konto
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Vi kan nå laste hele dokumentet inn i minnet fra XML -rotelementet. I vårt eksempel er det katalog element.

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

Og det er det, folkens! DOM API for å lese en XML er veldig enkel. Du har nå tilgang til hele XML -dokumentet fra rotelementet, katalog . La oss nå se hvordan vi jobber med det.





Bruke DOM API

Nå som vi har XML -roten Element , kan vi bruke DOM API for å hente ut interessante informasjonsmasser.

Få alt bok barn av rotelementet og sløyfe over dem. Noter det getChildNodes () returnerer alle barn, inkludert tekst, kommentarer, etc. For vårt formål trenger vi bare barneelementene, så vi hopper over de andre.

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
}

Hvordan finner du et bestemt barneelement, gitt forelder? Følgende statiske metode returnerer det første matchende elementet hvis det er funnet, eller null. Som du kan se, innebærer prosedyren å få listen over barnnoder og gå gjennom dem for å plukke ut elementnoder med det angitte navnet.

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

Vær oppmerksom på at DOM API behandler tekstinnhold i et element som en egen type node TEXT_NODE . I tillegg kan tekstinnholdet deles inn i flere tilgrensende tekstnoder. Så følgende spesialbehandling er nødvendig for å hente tekstinnholdet i et 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æpnet med disse bekvemmelighetsfunksjonene, la oss nå se på noen kode for å liste opp informasjon fra vår eksempel -XML. Vi vil vise detaljert informasjon for hver bok, slik som den er tilgjengelig 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);
}

Skriver XML -utdata

Java gir XML Tranform API for å transformere XML -data. Vi bruker denne API -en med identitetstransform for å generere utgang.

Som et eksempel, la oss legge til en ny bok element i prøvekatalogen som er presentert ovenfor. Detaljene i boken (for eksempel forfatter , tittel , osv.) kan hentes eksternt, kanskje fra en egenskapsfil eller en database. Vi bruker følgende egenskapsfil for å laste inn dataene.

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ørste trinnet er å analysere den eksisterende XML -filen ved å bruke metoden som presenteres ovenfor. Koden er også vist nedenfor.

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

Vi laster inn dataene fra egenskapsfilen ved hjelp av Egenskaper klasse utstyrt med java. Koden er ganske enkel og vist nedenfor.

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

Når egenskapene er lastet, henter vi verdiene vi vil legge til fra eiendomsfilen.

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

La oss nå lage et tomt bok element.

varsler instagram når du tar skjermbilde av en dm
Element book = document.createElement('book');
book.setAttribute('id', id);

Legge til barnelementene i bok er trivielt. For enkelhets skyld samler vi de nødvendige elementnavnene i a Liste og legg til verdiene i en løkke.

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

Og det er slik det gjøres. De katalog elementet har nå det nye bok element lagt til. Det eneste som gjenstår nå er å skrive ut den oppdaterte XML -en.

For å skrive XML trenger vi en forekomst av Transformator som er opprettet som vist nedenfor. Vær oppmerksom på at vi ber om innrykk av XML -filen ved hjelp av setOutputProperty () metode.

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

Det siste trinnet i å generere XML -utdata er å bruke transformasjonen. Resultatet vises på utgangsstrømmen, System.out .

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

Bruk følgende for å skrive utskriften direkte til en fil.

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

Og det omslutter denne artikkelen om å lese og skrive XML -filer ved hjelp av DOM API.

Har du brukt DOM API i programmene dine? Hvordan fungerte det? Gi oss beskjed i kommentarene nedenfor.

Dele Dele kvitring E -post Canon vs Nikon: Hvilket kameramerk er bedre?

Canon og Nikon er de to største navnene i kamerabransjen. Men hvilket merke tilbyr den bedre serien med kameraer og objektiver?

Les neste
Relaterte temaer
  • Programmering
  • Java
Om forfatteren Jay Sridhar(17 artikler publisert) Mer fra Jay Sridhar

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere