Kako čitati i pisati XML datoteke s kodom

Kako čitati i pisati XML datoteke s kodom

Želite li naučiti čitati i pisati XML datoteku iz jave?





XML datoteke koriste se u razne svrhe, uključujući pohranu podataka. Prije nego što je JSON postao popularan, XML je bio preferirani format za predstavljanje, pohranu i prijenos strukturiranih podataka. Iako je popularnost XML -a opadala posljednjih godina, povremeno se možete susresti s njim pa je važno naučiti kako raditi s njim iz koda.





Java Standard Edition (SE) uključuje Java API za XML obradu (JAXP) , koji je krovni pojam koji pokriva većinu aspekata XML obrade. To uključuje:





  • OSUDA: Objektni model dokumenta uključuje klase za rad s XML artefaktima kao što su element, čvor, atributi itd. DOM API učitava cijeli XML dokument u memoriju za obradu, pa nije prikladan za rad s velikim XML datotekama.
  • SAKSOFON: Jednostavni API za XML algoritam je za čitanje XML-a usmjeren na događaje. Ovdje se XML obrađuje pokretanjem događaja pronađenih pri čitanju XML -a. Memorijski zahtjevi za korištenje ove metode su niski, no rad s API -jem složeniji je od rada s DOM -om.
  • STAX: Streaming API za XML nedavni je dodatak XML API-ima i pruža filtriranje, obradu i izmjenu XML-a s visokim performansama. Iako izbjegava učitavanje cijelog XML dokumenta u memoriju, on nudi arhitekturu povlačenja, a ne arhitekturu upravljanu događajima, pa je aplikaciju lakše kodirati i razumjeti nego pomoću SAX API-ja.

U ovom članku koristimo DOM API pokazati kako čitati i pisati XML datoteke iz Java -e. Druga dva API -ja pokriti ćemo u budućim člancima.

Primjer XML datoteke

U svrhu ovog članka pokazujemo koncepte pomoću sljedećeg uzorka XML -a koji se može pronaći ovdje :






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


Ralls, Kim
...

Čitanje XML datoteke

Pogledajmo osnovne korake potrebne za čitanje XML datoteke pomoću DOM API -ja.

Prvi korak je nabaviti instancu DocumentBuilder . Graditelj se koristi za raščlanjivanje XML dokumenata. Za osnovnu uporabu, radimo ovako:





provjerite radi li vaš audio hardver ispravno Windows 10
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Sada možemo učitati cijeli dokument u memoriju počevši od korijenskog elementa XML. U našem primjeru to je katalog element.

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

I to je to, ljudi! DOM API za čitanje XML -a vrlo je jednostavan. Sada imate pristup cijelom XML dokumentu počevši od njegovog korijenskog elementa, katalog . Pogledajmo sada kako raditi s tim.





Korištenje DOM API -ja

Sada kada imamo XML korijen Element , možemo koristiti DOM API za izvlačenje zanimljivih informacija.

Nabavite sve knjiga djeca elementa korijena i petlja preko njih. Imajte na umu da getChildNodes () vraća svi djece, uključujući tekst, komentare itd. U naše svrhe potrebni su nam samo dječji elementi pa preskačemo ostale.

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 pronalaziš određeni podređeni element, s obzirom na roditelja? Sljedeća statička metoda vraća prvi odgovarajući element ako je pronađen ili null. Kao što vidite, postupak uključuje dobivanje popisa podređenih čvorova i njihovo ponavljanje pri odabiru čvorova elemenata s navedenim 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;
}

Imajte na umu da DOM API tretira tekstualni sadržaj unutar elementa kao zaseban čvor tipa TEXT_NODE . Osim toga, tekstualni sadržaj može se podijeliti na više susjednih tekstualnih čvorova. Stoga je za dohvaćanje tekstualnog sadržaja unutar elementa potrebna sljedeća posebna obrada.

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

Naoružani ovim praktičnim funkcijama, pogledajmo sada neki kod za ispis nekih informacija iz našeg uzorka XML -a. Željeli bismo prikazati detaljne informacije o svakoj knjizi, poput onih koje bi bile dostupne u katalogu knjiga.

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 XML izlaza

Java pruža API za XML Tranform za pretvaranje XML podataka. Ovaj API koristimo s transformacija identiteta za generiranje izlaza.

Kao primjer, dodajmo novu knjiga element gore navedenog kataloga uzoraka. Pojedinosti o knjizi (npr Autor , titula itd.) mogu se dobiti izvana, možda iz datoteke svojstava ili baze podataka. Za učitavanje podataka koristimo sljedeću datoteku svojstava.

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 raščlaniti postojeću XML datoteku pomoću gore navedene metode. Kôd je također prikazan ispod.

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

Učitavamo podatke iz datoteke svojstava pomoću Svojstva razred s javom. Kôd je vrlo jednostavan i prikazan je u nastavku.

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

Nakon što se svojstva učitaju, dohvaćamo vrijednosti koje želimo dodati iz datoteke svojstava.

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

Sada stvorimo prazno knjiga element.

zašto se moja poruka ne prenosi
Element book = document.createElement('book');
book.setAttribute('id', id);

Dodavanje podređenih elemenata u knjiga je trivijalno. Radi praktičnosti, prikupljamo potrebne nazive elemenata u Popis i dodajte vrijednosti u petlju.

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

I tako se to radi. The katalog element sada ima novo knjiga element dodan. Sada ostaje samo ispisati ažurirani XML.

Za pisanje XML -a potrebna nam je instanca Transformator koji je kreiran kako je dolje prikazano. Imajte na umu da zahtijevamo uvlačenje izlaznog XML -a pomoću 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');

Posljednji korak u generiranju XML izlaza je primjena tranformacije. Rezultat se prikazuje na izlaznom toku, System.out .

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

Da biste ispis zapisali izravno u datoteku, upotrijebite sljedeće.

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

To završava ovaj članak o čitanju i pisanju XML datoteka pomoću DOM API -ja.

Jeste li koristili DOM API u svojim aplikacijama? Kako se pokazao? Molimo vas da nas obavijestite u komentarima ispod.

Udio Udio Cvrkut E -pošta Canon protiv Nikona: Koja je marka fotoaparata bolja?

Canon i Nikon dva su najveća imena u industriji fotoaparata. No, koja marka nudi bolju liniju fotoaparata i objektiva?

Pročitajte Dalje
Povezane teme
  • Programiranje
  • Java
O autoru Jay Sridhar(17 objavljenih članaka) Više od Jaya Sridhara

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e -knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu