Kuidas lugeda ja kirjutada koodiga XML -faile

Kuidas lugeda ja kirjutada koodiga XML -faile

Kas soovite õppida Java -st XML -faili lugemist ja kirjutamist?





XML -failid kasutatakse mitmesugustel eesmärkidel, sealhulgas andmete salvestamiseks. Enne JSONi populaarseks saamist oli XML eelistatud vorming struktureeritud andmete esitamiseks, säilitamiseks ja transportimiseks. Kuigi XML -i populaarsus on viimastel aastatel vähenenud, võib see aeg -ajalt kokku puutuda, seega on oluline õppida koodist töötama.





Java Standard Edition (SE) sisaldab Java API XML -i töötlemiseks (JAXP) , mis on katusmõiste, mis hõlmab enamikku XML -i töötlemise aspekte. Need sisaldavad:





  • KOHTUOTSUS: Dokumendiobjektide mudel sisaldab klasse töötamiseks XML -i artefaktidega, nagu element, sõlm, atribuudid jne. DOM API laadib kogu XML -dokumendi töötlemiseks mällu, seega ei sobi see suurte XML -failidega töötamiseks eriti.
  • SAX: Simple API for XML on sündmuspõhine algoritm XML-i lugemiseks. Siin töödeldakse XML -i XML -i lugemisel leitud sündmuste käivitamisega. Selle meetodi kasutamise mälunõuded on väikesed, kuid API -ga töötamine on keerulisem kui DOM -iga töötamine.
  • STAX: Streaming API for XML on hiljutine lisand XML API-dele ja pakub suure jõudlusega voogude filtreerimist, töötlemist ja XML-i muutmist. Kuigi see väldib kogu XML-dokumendi mällu laadimist, pakub see pull-tüüpi arhitektuuri, mitte sündmustepõhist arhitektuuri, seega on rakendust lihtsam kodeerida ja mõista kui SAX-i API-d.

Selles artiklis kasutame DOM API demonstreerida, kuidas javast XML -faile lugeda ja kirjutada. Ülejäänud kahte API -d käsitleme tulevastes artiklites.

XML -faili näidis

Selle artikli jaoks demonstreerime mõisteid, kasutades järgmist XML -näidist, mille leiate siin :






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


Ralls, Kim
...

XML -faili lugemine

Vaatame põhilisi samme, mis on vajalikud XML -faili lugemiseks DOM -i API abil.

Esimene samm on hankida eksemplar DocumentBuilder . Ehitajat kasutatakse XML -dokumentide sõelumiseks. Põhikasutuseks teeme seda järgmiselt:





pääsete Windowsist raspberry pi failidele juurde
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Nüüd saame kogu dokumendi mällu laadida alates XML juurelemendist. Meie näites on see kataloogi element.

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

Ja see on kõik, inimesed! DOM -i API XML -i lugemiseks on tõesti lihtne. Nüüd on teil juurdepääs kogu XML -dokumendile alates selle juurelemendist, kataloogi . Vaatame nüüd, kuidas sellega töötada.





DOM API kasutamine

Nüüd, kui meil on XML -juur Element , saame kasutada DOM -i API -d huvitavate infokillude hankimiseks.

Hankige kõik raamat juurelemendi lapsed ja loop üle nende. Pange tähele, et getChildNodes () naaseb kõik lapsed, sealhulgas tekst, kommentaarid jne. Meie jaoks on vaja ainult lapselisi elemente, seega jätame teised üle.

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
}

Kuidas vanemat arvestades konkreetset alamelementi leida? Järgmine staatiline meetod tagastab esimese sobiva elemendi, kui see on leitud, või null. Nagu näete, hõlmab see protseduur alam -sõlmede loendi hankimist ja nende läbimist, et valida määratud nimega elemendisõlmed.

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

Pange tähele, et DOM API käsitleb elemendi tekstisisu eraldi tüübisõlmena TEXT_NODE . Lisaks võib teksti sisu jagada mitmeks külgnevaks tekstisõlmeks. Seega on elemendi tekstisisu toomiseks vaja järgmist eritöötlust.

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

Nende mugavusfunktsioonidega relvastatuna vaatame nüüd mõnda koodi meie näidis XML -i teabe loetlemiseks. Soovime näidata üksikasjalikku teavet iga raamatu kohta, näiteks raamatukataloogis.

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 -väljundi kirjutamine

Java pakub XML Tranform API XML -andmete teisendamiseks. Me kasutame seda API koos identiteedi muutmine väljundi genereerimiseks.

Lisame näitena uue raamat element ülaltoodud näidiskataloogi. Raamatu üksikasjad (nt autor , tiitel jne) saab hankida väljastpoolt, võib -olla atribuutide failist või andmebaasist. Kasutame andmete laadimiseks järgmist atribuutide faili.

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.

Esimene samm on olemasoleva XML -faili sõelumine ülaltoodud meetodil. Kood on näidatud ka allpool.

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

Laadime andmed atribuutide failist, kasutades Omadused klass on varustatud javaga. Kood on üsna lihtne ja näidatud allpool.

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

Kui atribuudid on laaditud, toome atribuutide failist alla väärtused, mida soovime lisada.

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

Loome nüüd tühja raamat element.

töötab google home'iga uksekell
Element book = document.createElement('book');
book.setAttribute('id', id);

Alamelementide lisamine kausta raamat on tühine. Mugavuse huvides kogume nõutud elementide nimed a -sse Nimekiri ja lisage väärtused silmusesse.

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

Ja nii tehaksegi. The kataloogi elemendil on nüüd uus raamat element lisatud. Nüüd jääb üle vaid uuendatud XML välja kirjutada.

XML -i kirjutamiseks vajame eksemplari Trafo mis on loodud allpool näidatud viisil. Pange tähele, et me taotleme väljundi XML taanet, kasutades setOutputProperty () meetod.

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

Viimane samm XML -väljundi genereerimisel on transformatsiooni rakendamine. Tulemus kuvatakse väljundvoos, System.out .

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

Väljundi otse faili kirjutamiseks kasutage järgmist.

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

Ja see lõpetab selle artikli XML -failide lugemise ja kirjutamise kohta DOM API abil.

Kas olete oma rakendustes kasutanud DOM API -d? Kuidas see esines? Palun andke meile sellest allpool kommentaarides teada.

Jaga Jaga Piiksuma E -post Canon vs Nikon: milline kaamera kaubamärk on parem?

Canon ja Nikon on kaameratööstuse kaks suurimat nime. Kuid milline kaubamärk pakub paremat kaamerate ja objektiivide valikut?

Loe edasi
Seotud teemad
  • Programmeerimine
  • Java
Autori kohta Jay Sridhar(17 artiklit avaldatud) Veel Jay Sridharilt

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin