Sådan læses og skrives XML -filer med kode

Sådan læses og skrives XML -filer med kode

Vil du lære at læse og skrive en XML -fil fra java?





XML -filer bruges til forskellige formål, herunder lagring af data. Inden JSON blev populær, var XML det foretrukne format til repræsentation, lagring og transport af strukturerede data. Selvom populariteten af ​​XML er aftaget i de seneste år, kan du støde på det lejlighedsvis, så det er vigtigt at lære at arbejde med det fra kode.





Java Standard Edition (SE) inkluderer Java API til XML -behandling (JAXP) , som er et paraplybegreb, der dækker de fleste aspekter af XML -behandling. Disse omfatter:





  • DOM: Dokumentobjektmodellen indeholder klasser til arbejde med XML -artefakter som element, node, attributter osv. DOM API indlæser det komplette XML -dokument i hukommelsen til behandling, så det er ikke særlig velegnet til arbejde med store XML -filer.
  • SAX: Simple API til XML er en hændelsesdrevet algoritme til læsning af XML. Her behandles XML ved at affyre begivenheder fundet ved læsning af XML. Kravene til hukommelse til brug af denne metode er lave, men at arbejde med API er mere komplekst end at arbejde med DOM.
  • StAX: Streaming-API'en til XML er en nylig tilføjelse til XML-API'erne og leverer højtydende strømfiltrering, behandling og ændring af XML. Selvom det undgår at indlæse hele XML-dokumentet i hukommelsen, giver det en pull-type arkitektur frem for en hændelsesdrevet arkitektur, så applikationen er lettere at kode og forstå end at bruge SAX API.

I denne artikel bruger vi DOM API for at demonstrere, hvordan man læser og skriver XML -filer fra java. Vi vil dække de to andre API'er i fremtidige artikler.

En prøve XML -fil

Med henblik på denne artikel demonstrerer vi begreberne ved hjælp af følgende eksempel -XML, som kan findes her :






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


Ralls, Kim
...

Læsning af en XML -fil

Lad os se på de grundlæggende trin, der kræves for at læse en XML -fil ved hjælp af DOM API.

Det første trin er at få en forekomst af DocumentBuilder . Byggeren bruges til at analysere XML -dokumenter. Til grundlæggende brug gør vi det sådan:





hvor kan du bruge PayPal -kredit
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Vi kan nu indlæse hele dokumentet i hukommelsen fra XML -rodelementet. I vores 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 til læsning af en XML er virkelig enkel. Du har nu adgang til hele XML -dokumentet fra dets rodelement, katalog . Lad os nu se, hvordan vi arbejder med det.





Brug af DOM API

Nu hvor vi har XML -roden Element , kan vi bruge DOM API til at udtrække interessante nuggets af information.

Få alt Bestil børn af rodelementet og sløjfe hen over dem. Noter det getChildNodes () vender tilbage alle børn, herunder tekst, kommentarer osv. Til vores formål har vi kun brug for barnelementerne, så vi springer 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 finder du et specifikt barnelement, givet forælderen? Den følgende statiske metode returnerer det første matchende element, hvis det er fundet eller null. Som du kan se, involverer proceduren at få listen over underordnede noder og løbe igennem dem for at vælge elementnoder med det angivne navn.

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

Bemærk, at DOM API behandler tekstindhold i et element som en separat node af type TEXT_NODE . Desuden kan tekstindholdet opdeles i flere tilstødende tekstnoder. Så følgende særlige behandling er påkrævet for at hente tekstindholdet 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æbnet med disse bekvemmelighedsfunktioner, lad os nu se på en kode for at få vist nogle oplysninger fra vores prøve -XML. Vi vil gerne vise detaljerede oplysninger for hver bog, som f.eks. Ville være tilgængelige i et bogkatalog.

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

Skrivning af XML -output

Java leverer XML Tranform API at transformere XML -data. Vi bruger denne API med identitetstransform at generere output.

Lad os som et eksempel tilføje en ny Bestil element til prøvekataloget præsenteret ovenfor. Detaljerne i bogen (f.eks forfatter , titel osv.) kan hentes eksternt, måske fra en egenskabsfil eller en database. Vi bruger følgende egenskabsfil til at indlæse 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 trin er at analysere den eksisterende XML -fil ved hjælp af metoden ovenfor. Koden er også vist herunder.

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

Vi indlæser dataene fra egenskabsfilen ved hjælp af Ejendomme klasse forsynet 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 egenskaberne er indlæst, henter vi de værdier, vi vil tilføje fra egenskabsfilen.

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

Lad os nu oprette en tom Bestil element.

finde alle profiler, der er knyttet til e -mail -adresse
Element book = document.createElement('book');
book.setAttribute('id', id);

Tilføjelse af barnelementerne til Bestil er trivielt. For nemheds skyld samler vi de nødvendige elementnavne i a Liste og tilføj værdierne 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);

Og sådan gøres det. Det katalog element har nu det nye Bestil element tilføjet. Det eneste, der er tilbage nu, er at skrive den opdaterede XML ud.

For at skrive XML har vi brug for en forekomst af Transformer som er oprettet som vist herunder. Bemærk, at vi anmoder om indrykning af output -XML'en ved hjælp af 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 sidste trin i genereringen af ​​XML -output er at anvende tranformationen. Resultatet vises på outputstrømmen, System.out .

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

Hvis du vil skrive output direkte til en fil, skal du bruge følgende.

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

Og det afslutter denne artikel om at læse og skrive XML -filer ved hjælp af DOM API.

Har du brugt DOM API i dine applikationer? Hvordan fungerede det? Lad os vide det i kommentarerne herunder.

Del Del Tweet E -mail Canon vs Nikon: Hvilket kameramærke er bedre?

Canon og Nikon er de to største navne i kameraindustrien. Men hvilket mærke tilbyder den bedre serie af kameraer og objektiver?

Læs Næste
Relaterede emner
  • Programmering
  • Java
Om forfatteren Jay Sridhar(17 artikler udgivet) Mere fra Jay Sridhar

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere