Jak číst a zapisovat soubory XML pomocí kódu

Jak číst a zapisovat soubory XML pomocí kódu

Chtěli byste se naučit číst a zapisovat soubor XML z Java?





XML soubory se používají k různým účelům, včetně ukládání dat. Než se JSON stal populárním, byl XML preferovaným formátem pro reprezentaci, ukládání a přenos strukturovaných dat. Přestože popularita XML v posledních letech klesá, můžete se s ní občas setkat, proto je důležité naučit se s ní pracovat z kódu.





Java Standard Edition (SE) obsahuje Java API pro zpracování XML (JAXP) , což je zastřešující termín pokrývající většinu aspektů zpracování XML. Tyto zahrnují:





  • ROZSUDEK: Objektový model dokumentu obsahuje třídy pro práci s artefakty XML, jako jsou prvky, uzly, atributy atd. Rozhraní DOM API načte kompletní dokument XML do paměti pro zpracování, takže pro práci s velkými soubory XML není příliš vhodný.
  • SAXOFON: Simple API for XML je algoritmus řízený událostmi pro čtení XML. Zde je XML zpracováváno událostmi spouštění nalezenými při čtení XML. Požadavky na paměť pro použití této metody jsou nízké, ale práce s API je složitější než práce s DOM.
  • STAX: Streaming API pro XML je nedávný přírůstek do XML API a poskytuje vysoce výkonné filtrování, zpracování a úpravy XML streamů. Přestože se vyhýbá načítání celého dokumentu XML do paměti, poskytuje spíše architekturu typu pull než architekturu řízenou událostmi, takže aplikace je jednodušší kódovat a porozumět než pomocí API SAX.

V tomto článku používáme DOM API ukázat, jak číst a zapisovat soubory XML z Java. Ostatním dvěma API se budeme věnovat v dalších článcích.

Ukázkový soubor XML

Pro účely tohoto článku předvádíme koncepty pomocí následujícího ukázkového XML, které lze nalézt tady :






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


Ralls, Kim
...

Čtení souboru XML

Podívejme se na základní kroky nutné ke čtení souboru XML pomocí rozhraní DOM API.

Prvním krokem je získání instance DocumentBuilder . Tvůrce se používá k analýze dokumentů XML. Pro základní použití to děláme takto:





jak zjistit heslo k outlooku
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Nyní můžeme načíst celý dokument do paměti počínaje kořenovým prvkem XML. V našem příkladu je to katalog živel.

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

A je to, lidi! Rozhraní DOM API pro čtení XML je opravdu jednoduché. Nyní máte přístup k celému dokumentu XML počínaje jeho kořenovým prvkem, katalog . Pojďme se nyní podívat, jak s tím pracovat.





Pomocí rozhraní DOM API

Nyní, když máme kořen XML Živel , můžeme použít DOM API k extrahování zajímavých nugetů informací.

Získejte vše rezervovat děti kořenového prvku a smyčku nad nimi. Všimněte si, že getChildNodes () vrací Všechno děti, včetně textu, komentářů atd. Pro svůj účel potřebujeme pouze podřízené prvky, takže přeskočí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
}

Jak zjistíte konkrétní podřízený prvek vzhledem k rodiči? Následující statická metoda vrátí první odpovídající prvek, pokud je nalezen, nebo null. Jak vidíte, postup zahrnuje získání seznamu podřízených uzlů a jejich procházení při výběru uzlů prvků se zadaným názvem.

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šimněte si, že rozhraní DOM API považuje textový obsah v prvku za samostatný uzel typu TEXT_NODE . Kromě toho může být textový obsah rozdělen do několika sousedních textových uzlů. K načtení textového obsahu v rámci prvku je tedy zapotřebí následující speciální zpracování.

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

Vyzbrojeni těmito praktickými funkcemi se nyní podívejme na nějaký kód pro výpis některých informací z našeho ukázkového XML. Rádi bychom pro každou knihu ukázali podrobné informace, které by byly k dispozici v katalogu knih.

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

Zápis XML výstupu

Java poskytuje XML Tranform API transformovat data XML. Toto API používáme s transformace identity generovat výstup.

Jako příklad přidejme nový rezervovat prvek do ukázkového katalogu uvedeného výše. Podrobnosti o knize (např autor , titul atd.) lze získat externě, například ze souboru vlastností nebo databáze. K načtení dat používáme následující soubor 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.

Prvním krokem je analyzovat stávající soubor XML pomocí výše uvedené metody. Kód je také uveden níže.

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

Načteme data ze souboru vlastností pomocí Vlastnosti třída vybavena javou. Kód je poměrně jednoduchý a je zobrazen níže.

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

Jakmile jsou vlastnosti načteny, načteme hodnoty, které chceme přidat, ze souboru 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');

Pojďme nyní vytvořit prázdný rezervovat živel.

jak změním svůj výchozí účet Google v chromu
Element book = document.createElement('book');
book.setAttribute('id', id);

Přidání podřízených prvků do souboru rezervovat je triviální. Pro pohodlí shromažďujeme požadované názvy prvků v souboru Seznam a přidejte hodnoty do smyč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 tak se to dělá. The katalog prvek má nyní nový rezervovat přidán prvek. Nyní zbývá jen vypsat aktualizovaný XML.

Pro psaní XML potřebujeme instanci Transformátor který je vytvořen, jak je znázorněno níže. Všimněte si, že požadujeme odsazení výstupního XML pomocí 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');

Posledním krokem při generování výstupu XML je použití transformace. Výsledek se objeví na výstupním proudu, System.out .

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

Chcete -li zapsat výstup přímo do souboru, použijte následující.

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

A tím je zabalen tento článek o čtení a zápisu souborů XML pomocí rozhraní DOM API.

Použili jste ve svých aplikacích rozhraní DOM API? Jak to fungovalo? Dejte nám prosím vědět v níže uvedených komentářích.

Podíl Podíl tweet E-mailem Canon vs. Nikon: Která značka fotoaparátu je lepší?

Canon a Nikon jsou dvě největší jména v oboru fotoaparátů. Ale která značka nabízí lepší řadu fotoaparátů a objektivů?

Číst dále
Související témata
  • Programování
  • Jáva
O autorovi Jay Sridhar(17 článků zveřejněno) Více od Jaye Sridhar

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru