XML -fájlok olvasása és írása kóddal

XML -fájlok olvasása és írása kóddal

Szeretné megtanulni, hogyan olvashat és írhat XML fájlt a java -ból?





XML fájlok különféle célokra használják, beleértve az adatok tárolását. Mielőtt a JSON népszerűvé vált, az XML volt a preferált formátum a strukturált adatok megjelenítésére, tárolására és szállítására. Annak ellenére, hogy az XML népszerűsége az elmúlt években csökkent, időnként találkozhat vele, ezért fontos, hogy a kódból megtanulja, hogyan kell vele dolgozni.





A Java Standard Edition (SE) tartalmazza a Java API az XML -feldolgozáshoz (JAXP) , amely egy átfogó kifejezés, amely az XML -feldolgozás legtöbb aspektusát lefedi. Ezek tartalmazzák:





  • ÍTÉLET: A Dokumentumobjektum -modell olyan osztályokat tartalmaz, amelyek XML -melléktermékekkel, például elemekkel, csomópontokkal, attribútumokkal stb. Dolgoznak. A DOM API betölti a teljes XML -dokumentumot a memóriába feldolgozásra, ezért nem nagyon alkalmas nagy XML -fájlok kezelésére.
  • SAX: Az Simple API for XML egy eseményvezérelt algoritmus az XML olvasásához. Itt az XML feldolgozása az XML olvasása során talált események aktiválásával történik. A módszer használatához szükséges memóriaigény alacsony, de az API -val való munka bonyolultabb, mint a DOM.
  • StAX: A Streaming API for XML egy újabb kiegészítés az XML API-khoz, és nagy teljesítményű adatfolyam szűrést, feldolgozást és módosítást biztosít az XML számára. Bár elkerüli a teljes XML dokumentum memóriába való betöltését, pull-típusú architektúrát biztosít, nem pedig eseményvezérelt architektúrát, így az alkalmazás könnyebben kódolható és érthető, mint a SAX API használata.

Ebben a cikkben a DOM API hogy bemutassa, hogyan kell olvasni és írni XML fájlokat a Java -ból. A másik két API -val a következő cikkekben foglalkozunk.

Minta XML fájl

E cikk céljaira a következő XML minta segítségével mutatjuk be a fogalmakat, amelyek megtalálhatók itt :






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


Ralls, Kim
...

XML fájl olvasása

Nézzük meg az alapvető lépéseket, amelyek szükségesek egy XML fájl DOM API használatával történő olvasásához.

Az első lépés egy példány beszerzése DocumentBuilder . A készítő az XML dokumentumok elemzésére szolgál. Alapvető használat esetén a következőképpen járunk el:





alkalmazás, amely lehetővé teszi az iskolai wifi használatát
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Most már betölthetjük a teljes dokumentumot a memóriába az XML gyökér elemtől kezdve. Példánkban ez a katalógus elem.

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

És ennyi, emberek! Az XML olvasására szolgáló DOM API nagyon egyszerű. Most már hozzáférhet a teljes XML dokumentumhoz a gyökér elemétől kezdve, katalógus . Most nézzük meg, hogyan kell vele dolgozni.





A DOM API használata

Most, hogy megvan az XML gyökere Elem , a DOM API segítségével érdekes információcsomagokat tudunk kinyerni.

Szerezd meg az összeset könyv a gyökér elem gyermekei, és hurok rajtuk. Vegye figyelembe, hogy getChildNodes () visszatér összes gyermekek, beleértve a szöveget, megjegyzéseket stb. A célunkhoz csak a gyermek elemekre van szükségünk, ezért átugorjuk a többieket.

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
}

Hogyan talál egy adott gyermekelemet, tekintettel a szülőre? A következő statikus módszer az első egyező elemet adja vissza, ha megtalálható, vagy null. Amint láthatja, az eljárás magában foglalja a gyermekcsomópontok listájának beszerzését, és a rajtuk való ciklusban a megadott nevű elemcsomópontok kiválasztását.

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

Vegye figyelembe, hogy a DOM API egy elemen belüli szöveges tartalmat külön típusú csomópontként kezeli TEXT_NODE . Ezenkívül a szöveges tartalom több szomszédos szövegcsomópontra is felosztható. Tehát az alábbi speciális feldolgozás szükséges az elemen belüli szöveges tartalom lekéréséhez.

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

Ezekkel a kényelmi funkciókkal felfegyverkezve nézzünk most egy kódot, amely felsorol néhány információt a minta XML -ből. Minden könyvről részletes információkat szeretnénk megjeleníteni, például egy könyvkatalógusban.

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

XML kimenet írása

A Java biztosítja a XML Tranform API XML adatok átalakítására. Ezt az API -t a identitás átalakítása kimenetet generálni.

Példaként tegyünk hozzá egy újat könyv elemet a fent bemutatott mintakatalógusba. A könyv részletei (pl szerző , cím , stb.) kívülről szerezhetők be, például egy tulajdonságfájlból vagy egy adatbázisból. A következő tulajdonságfájlt használjuk az adatok betöltéséhez.

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.

Az első lépés a meglévő XML -fájl elemzése a fent bemutatott módszerrel. A kód is látható alább.

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

Az adatokat a tulajdonságfájlból töltjük be a Tulajdonságok osztály java -val. A kód meglehetősen egyszerű, és az alábbiakban látható.

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

A tulajdonságok betöltése után lekérjük a hozzáadni kívánt értékeket a tulajdonságfájlból.

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

Most hozzunk létre egy üres helyet könyv elem.

miért nem töltődik a laptopom akkumulátora?
Element book = document.createElement('book');
book.setAttribute('id', id);

A gyermek elemek hozzáadása a könyv triviális. A kényelem érdekében összegyűjtjük a szükséges elemneveket a Lista és hozzáadjuk az értékeket egy hurokhoz.

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

És ez így történik. Az katalógus elem most megkapta az újat könyv elem hozzáadva. Most már csak a frissített XML kiírása marad.

Az XML írásához szükségünk van egy példányra Transzformátor amely az alábbiak szerint jön létre. Ne feledje, hogy a kimenet XML behúzását kérjük a setOutputProperty () módszer.

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

Az XML kimenet létrehozásának utolsó lépése a transzformáció alkalmazása. Az eredmény megjelenik a kimeneti adatfolyamban, System.out .

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

Ha közvetlenül a fájlba szeretné írni a kimenetet, használja a következőket.

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

És ez befejezi ezt a cikket az XML fájlok olvasásáról és írásáról a DOM API használatával.

Használtad a DOM API -t az alkalmazásaidban? Hogyan teljesített? Kérjük, tudassa velünk az alábbi megjegyzésekben.

Részvény Részvény Csipog Email Canon vs Nikon: Melyik a jobb márka?

A Canon és a Nikon a két legnagyobb név a kameraiparban. De melyik márka kínálja a kamerák és objektívek jobb választékát?

Olvassa tovább
Kapcsolódó témák
  • Programozás
  • Jáva
A szerzőről Jay Sridhar(17 cikk megjelent) Bővebben: Jay Sridhar

Iratkozzon fel hírlevelünkre

Csatlakozz hírlevelünkhöz, ahol technikai tippeket, értékeléseket, ingyenes e -könyveket és exkluzív ajánlatokat találsz!

Feliratkozáshoz kattintson ide