Kako brati in pisati datoteke XML s kodo

Kako brati in pisati datoteke XML s kodo

Bi se radi naučili brati in pisati datoteko XML iz jave?





Datoteke XML se uporabljajo za različne namene, vključno s shranjevanjem podatkov. Preden je JSON postal priljubljen, je bil XML prednostna oblika za predstavitev, shranjevanje in prenos strukturiranih podatkov. Čeprav je priljubljenost XML v zadnjih letih upadla, ga lahko občasno naletite, zato se je pomembno, da se iz kode naučite delati z njim.





Standardna različica Java (SE) vključuje Java API za obdelavo XML (JAXP) , ki je krovni izraz, ki zajema večino vidikov obdelave XML. Tej vključujejo:





  • OBSODBA: Model predmeta dokumenta vključuje razrede za delo z artefakti XML, kot so elementi, vozlišča, atributi itd. API DOM naloži celoten dokument XML v pomnilnik za obdelavo, zato ni zelo primeren za delo z velikimi datotekami XML.
  • SAX: Enostaven API za XML je algoritem za branje XML, ki ga vodijo dogodki. Tu se XML obdeluje z sprožanjem dogodkov, ki jih najdemo pri branju XML. Potrebe po pomnilniku za uporabo te metode so nizke, vendar je delo z API -jem bolj zapleteno kot delo z DOM.
  • STAX: Streaming API za XML je nedavni dodatek API-jem XML in ponuja visoko zmogljivo filtriranje, obdelavo in spreminjanje tokov XML. Izogiba se nalaganju celotnega dokumenta XML v pomnilnik, vendar ponuja arhitekturo vlečnega tipa in ne arhitekturo, ki temelji na dogodkih, zato je aplikacijo lažje kodirati in razumeti kot uporabo API-ja SAX.

V tem članku uporabljamo DOM API za prikaz branja in pisanja datotek XML iz jave. Druga dva API -ja bomo obravnavali v prihodnjih člankih.

Primer datoteke XML

Za namen tega članka dokazujemo koncepte z naslednjim vzorčnim XML -jem, ki ga lahko najdete tukaj :






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


Ralls, Kim
...

Branje datoteke XML

Poglejmo osnovne korake, potrebne za branje datoteke XML z API -jem DOM.

Prvi korak je pridobitev primerka DocumentBuilder . Graditelj se uporablja za razčlenjevanje dokumentov XML. Za osnovno uporabo naredimo tako:





zakaj se na mojem telefonu pojavljajo naključni oglasi
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Zdaj lahko celoten dokument naložimo v pomnilnik, začenši z korenskim elementom XML. V našem primeru je to katalog element.

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

In to je to, ljudje! DOM API za branje XML je zelo preprost. Zdaj imate dostop do celotnega dokumenta XML, začenši z njegovim korenskim elementom, katalog . Poglejmo zdaj, kako delati z njim.





Uporaba DOM API -ja

Zdaj, ko imamo koren XML Element , lahko z API -jem DOM izvlečemo zanimive koščke informacij.

Pridobite vse knjigo otroci koreninskega elementa in zanko nad njimi. Upoštevajte, da getChildNodes () vrača vse otroci, vključno z besedilom, komentarji itd. Za svoj namen potrebujemo samo otroške elemente, zato preskočimo druge.

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
}

Kako glede na starša najdete poseben podrejeni element? Naslednja statična metoda vrne prvi ujemajoči se element, če je najden ali ničelni. Kot lahko vidite, postopek vključuje pridobivanje seznama podrejenih vozlišč in njihovo preklapljanje pri izbiri vozlišč elementov z določenim imenom.

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

Upoštevajte, da API DOM obravnava besedilno vsebino v elementu kot ločeno vozlišče vrste TEXT_NODE . Poleg tega je lahko besedilna vsebina razdeljena na več sosednjih besedilnih vozlišč. Zato je za pridobivanje besedilne vsebine znotraj elementa potrebna naslednja posebna obdelava.

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

Oboroženi s temi priročnimi funkcijami, poglejmo zdaj nekaj kode za navedbo nekaterih informacij iz našega vzorčnega XML. Za vsako knjigo bi radi prikazali podrobne informacije, kot bi bile na voljo v katalogu knjig.

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

Pisanje izhodov XML

Java ponuja XML Tranform API za pretvorbo podatkov XML. Ta API uporabljamo z preoblikovanje identitete ustvariti izhod.

Kot primer naj dodamo novo knjigo element vzorčnega kataloga, predstavljenega zgoraj. Podrobnosti knjige (npr avtor , naslov itd.) je mogoče pridobiti od zunaj, morda iz datoteke lastnosti ali zbirke podatkov. Za nalaganje podatkov uporabljamo naslednjo datoteko lastnosti.

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.

Prvi korak je razčleniti obstoječo datoteko XML s pomočjo zgoraj predstavljene metode. Koda je prikazana tudi spodaj.

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

Podatke naložimo iz datoteke lastnosti z uporabo Lastnosti razred z javo. Koda je precej preprosta in prikazana spodaj.

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

Ko so lastnosti naložene, pridobimo vrednosti, ki jih želimo dodati iz datoteke lastnosti.

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

Ustvarimo zdaj prazno knjigo element.

je wii u nazaj združljiv z gamecube
Element book = document.createElement('book');
book.setAttribute('id', id);

Dodajanje podrejenih elementov v knjigo je nepomembno. Zaradi priročnosti zbiramo potrebna imena elementov v Seznam in vrednosti dodamo v zanko.

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

In tako se to dela. The katalog element ima zdaj novega knjigo dodan element. Zdaj ostane le še zapisati posodobljen XML.

Za pisanje XML potrebujemo primerek Transformator ki je ustvarjen, kot je prikazano spodaj. Upoštevajte, da zahtevamo zamik izhodnega XML z uporabo setOutputProperty () metoda.

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

Zadnji korak pri ustvarjanju izhoda XML je uporaba transformacije. Rezultat se prikaže na izhodnem toku, System.out .

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

Če želite zapisati izhod neposredno v datoteko, uporabite naslednje.

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

To zaključuje ta članek o branju in pisanju datotek XML z API -jem DOM.

Ali ste v svojih aplikacijah uporabljali API DOM? Kako se je obnesel? Sporočite nam v spodnjih komentarjih.

Deliti Deliti Cvrkutati E-naslov Canon proti Nikon: katera znamka fotoaparata je boljša?

Canon in Nikon sta dve največji imeni v industriji fotoaparatov. Toda katera blagovna znamka ponuja boljšo ponudbo fotoaparatov in objektivov?

Preberite Naprej
Sorodne teme
  • Programiranje
  • Java
O avtorju Jay Sridhar(17 objavljenih člankov) Več od Jaya Sridharja

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e -knjige in ekskluzivne ponudbe!

Kliknite tukaj, če se želite naročiti