Ako čítať a zapisovať súbory XML pomocou kódu

Ako čítať a zapisovať súbory XML pomocou kódu

Chcete sa naučiť čítať a zapisovať súbor XML z jazyka Java?





Súbory XML sa používajú na rôzne účely vrátane ukladania údajov. Predtým, ako sa JSON stal populárnym, bol XML preferovaným formátom na reprezentáciu, ukladanie a prenos štruktúrovaných údajov. Napriek tomu, že popularita XML v posledných rokoch klesá, môžete sa s ním občas stretnúť, preto je dôležité naučiť sa s ním pracovať z kódu.





Java Standard Edition (SE) obsahuje súbor Java API pre spracovanie XML (JAXP) , čo je zastrešujúci termín pokrývajúci väčšinu aspektov spracovania XML. Tie obsahujú:





  • ROZSUDOK: Objektový model dokumentu obsahuje triedy na prácu s artefaktmi XML, ako sú prvky, uzly, atribúty atď. Rozhranie DOM API načítava kompletný dokument XML do pamäte na spracovanie, takže nie je príliš vhodný na prácu s veľkými súbormi XML.
  • SAX: Simple API for XML je algoritmus riadený udalosťami na čítanie XML. Tu je XML spracovaný udalosťami spustenia zistenými pri čítaní XML. Požiadavky na pamäť na používanie tejto metódy sú nízke, ale práca s API je zložitejšia ako práca s DOM.
  • STAX: Streaming API pre XML je nedávnym doplnkom k API XML a poskytuje vysoko výkonné filtrovanie, spracovanie a úpravy XML streamov. Aj keď sa vyhýba načítaniu celého dokumentu XML do pamäte, poskytuje skôr architektúru ťahaného typu než architektúru riadenú udalosťami, takže aplikácia je jednoduchšie kódovať a porozumieť ako pomocou rozhrania SAX API.

V tomto článku používame príponu DOM API ukázať, ako čítať a zapisovať súbory XML z jazyka java. Ostatným dvom API sa budeme venovať v ďalších článkoch.

Ukážkový súbor XML

Na účely tohto článku demonštrujeme koncepty pomocou nasledujúceho ukážkového súboru XML, ktorý nájdete tu :






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


Ralls, Kim
...

Čítanie súboru XML

Pozrime sa na základné kroky potrebné na čítanie súboru XML pomocou rozhrania DOM API.

Prvým krokom je získanie inštancie súboru DocumentBuilder . Builder sa používa na analýzu dokumentov XML. Pri základnom použití to robíme takto:





ako natrvalo nastaviť kvalitu videa na youtube v roku 2017
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Teraz môžeme načítať celý dokument do pamäte počnúc koreňovým prvkom XML. V našom prípade je to katalóg element.

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

A to je všetko, ľudia! Rozhranie DOM API na čítanie XML je skutočne jednoduché. Teraz máte prístup k celému dokumentu XML počnúc jeho koreňovým prvkom, katalóg . Teraz sa pozrime, ako s ním pracovať.





Použitie rozhrania DOM API

Teraz, keď máme koreň XML Element , môžeme použiť DOM API na extrahovanie zaujímavých nugetov informácií.

Získajte všetko kniha deti koreňového prvku a slučku nad nimi. Poznač si to getChildNodes () vracia všetky deti vrátane textu, komentárov atď. Na svoj účel potrebujeme iba podradené prvky, takže preskočíme ostatné.

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
}

Ako nájdete konkrétny detský prvok vzhľadom na rodiča? Nasledujúca statická metóda vráti prvý zodpovedajúci prvok, ak je nájdený, alebo je null. Ako vidíte, postup zahŕňa získanie zoznamu podradených uzlov a ich opakovanie pomocou výberu uzlov prvku so zadaným názvom.

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šimnite si toho, že DOM API považuje textový obsah v rámci prvku za samostatný uzol typu TEXT_NODE . Okrem toho môže byť textový obsah rozdelený do viacerých susedných textových uzlov. Na načítanie textového obsahu v rámci prvku je teda potrebné nasledujúce špeciálne spracovanie.

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

Vyzbrojení týmito praktickými funkciami sa teraz pozrime na nejaký kód na výpis niektorých informácií z nášho ukážkového XML. Radi by sme pre každú knihu ukázali podrobné informácie, ktoré by boli dostupné v katalógu kníh.

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

Zapisovanie výstupu XML

Java poskytuje XML Tranform API na transformáciu údajov XML. Toto API používame s príponou transformácia identity na generovanie výstupu.

Ako príklad uveďme nový kniha prvkom vyššie uvedeného katalógu ukážok. Podrobnosti o knihe (ako napr autor , titul , atď.) je možné získať externe, pravdepodobne zo súboru vlastností alebo z databázy. Na načítanie údajov používame nasledujúci súbor vlastností.

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.

Prvým krokom je analyzovať existujúci súbor XML pomocou vyššie uvedenej metódy. Kód je tiež zobrazený nižšie.

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

Údaje zo súboru vlastností načítame pomocou súboru Vlastnosti trieda vybavená javou. Kód je pomerne jednoduchý a je zobrazený nižšie.

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

Akonáhle sú vlastnosti načítané, načítame hodnoty, ktoré chceme pridať, zo súboru vlastností.

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

Teraz vytvoríme prázdno kniha element.

funguje zvonček zvončeka s domovom Google
Element book = document.createElement('book');
book.setAttribute('id', id);

Pridanie podradených prvkov do súboru kniha je triviálne. Pre pohodlie zhromažďujeme požadované názvy prvkov v a Zoznam a pridajte hodnoty do slučky.

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

A takto sa to robí. The katalóg prvok má teraz nové kniha prvok pridaný. Teraz zostáva len napísať aktualizovaný XML.

Na zápis XML potrebujeme inštanciu Transformátor ktorý je vytvorený tak, ako je to znázornené nižšie. Všimnite si toho, že požadujeme odsadenie výstupného XML pomocou setOutputProperty () metóda.

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

Posledným krokom pri generovaní výstupu XML je aplikácia transformácie. Výsledok sa zobrazí vo výstupnom prúde, System.out .

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

Ak chcete zapísať výstup priamo do súboru, použite nasledujúci postup.

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

A tým sa končí tento článok o čítaní a zápise súborov XML pomocou rozhrania DOM API.

Použili ste vo svojich aplikáciách rozhranie DOM API? Ako to fungovalo? Dajte nám prosím vedieť v nižšie uvedených komentároch.

zdieľam zdieľam Tweet E -mail Canon vs. Nikon: Ktorá značka fotoaparátu je lepšia?

Canon a Nikon sú dve najväčšie mená v kamerovom priemysle. Ale ktorá značka ponúka lepšiu radu fotoaparátov a objektívov?

Čítajte ďalej
Súvisiace témy
  • Programovanie
  • Java
O autorovi Jay Sridhar(17 článkov uverejnených) Viac od Jaya Sridhara

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné elektronické knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber