Kā lasīt un rakstīt XML failus ar kodu

Kā lasīt un rakstīt XML failus ar kodu

Vai vēlaties iemācīties lasīt un rakstīt XML failu no Java?





XML faili tiek izmantoti dažādiem mērķiem, tostarp datu glabāšanai. Pirms JSON kļuva populārs, XML bija vēlamais formāts strukturētu datu attēlošanai, glabāšanai un transportēšanai. Lai gan XML popularitāte pēdējos gados ir samazinājusies, jūs ik pa laikam varat saskarties ar to, tāpēc ir svarīgi iemācīties ar to strādāt, izmantojot kodu.





Java standarta izdevums (SE) ietver Java API XML apstrādei (JAXP) , kas ir jumta termins, kas aptver lielāko daļu XML apstrādes aspektu. Tie ietver:





  • SPRIEDUMS: Dokumenta objekta modelī ir iekļautas klases darbam ar XML artefaktiem, piemēram, elementu, mezglu, atribūtiem utt. DOM API ielādē visu XML dokumentu atmiņā apstrādei, tāpēc tas nav īpaši piemērots darbam ar lieliem XML failiem.
  • SAX: Vienkāršā XML API ir uz notikumiem balstīts algoritms XML lasīšanai. Šeit XML tiek apstrādāts, aktivizējot notikumus, kas atrasti, lasot XML. Atmiņas prasības šīs metodes izmantošanai ir zemas, taču darbs ar API ir sarežģītāks nekā darbs ar DOM.
  • STAX: Straumēšanas API XML ir nesen pievienots XML API un nodrošina augstas veiktspējas straumju filtrēšanu, apstrādi un XML modificēšanu. Lai gan tas izvairās no visa XML dokumenta ielādes atmiņā, tas nodrošina vilkšanas tipa arhitektūru, nevis notikumu vadītu arhitektūru, tāpēc lietojumprogrammu ir vieglāk kodēt un saprast nekā izmantot SAX API.

Šajā rakstā mēs izmantojam DOM API lai parādītu, kā lasīt un rakstīt XML failus no java. Nākamajos rakstos mēs apskatīsim pārējās divas API.

XML faila paraugs

Šajā rakstā mēs demonstrējam jēdzienus, izmantojot šādu XML paraugu, kas atrodams šeit :






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


Ralls, Kim
...

XML faila lasīšana

Apskatīsim pamata darbības, kas nepieciešamas XML faila lasīšanai, izmantojot DOM API.

Pirmais solis ir iegūt piemēru DocumentBuilder . Būvnieks tiek izmantots XML dokumentu parsēšanai. Pamata lietošanai mēs to darām šādi:





vairāku reģionu DVD atskaņotājs, ko vislabāk iegādāties
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Tagad mēs varam ielādēt visu dokumentu atmiņā, sākot no XML saknes elementa. Mūsu piemērā tas ir katalogs elements.

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

Un tas arī ir, ļaudis! DOM API XML lasīšanai ir patiešām vienkārša. Tagad jums ir piekļuve visam XML dokumentam, sākot no tā saknes elementa, katalogs . Tagad redzēsim, kā ar to strādāt.





Izmantojot DOM API

Tagad, kad mums ir XML sakne Elements , mēs varam izmantot DOM API, lai iegūtu interesantus informācijas gabalus.

Iegūstiet visu grāmata saknes elementa bērni un cilpa pār tiem. Pieraksti to getChildNodes () atgriežas visas bērniem, ieskaitot tekstu, komentārus utt. Mūsu nolūkā mums ir nepieciešami tikai bērnu elementi, tāpēc mēs izlaižam pārējos.

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
}

Kā atrast konkrētu bērna elementu, ņemot vērā vecāku? Šī statiskā metode atgriež pirmo atbilstošo elementu, ja tas ir atrasts, vai nulli. Kā redzat, procedūra ietver pakārtoto mezglu saraksta iegūšanu un cilpu cauri tiem, izvēloties elementu mezglus ar norādīto nosaukumu.

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

Ņemiet vērā, ka DOM API elementa teksta saturu uzskata par atsevišķu tipa mezglu TEXT_NODE . Turklāt teksta saturu var sadalīt vairākos blakus esošos teksta mezglos. Tātad, lai iegūtu elementa teksta saturu, ir nepieciešama šāda īpaša apstrāde.

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

Apbruņojušies ar šīm ērtības funkcijām, tagad apskatīsim kādu kodu, lai uzskaitītu kādu informāciju no mūsu XML parauga. Mēs vēlētos parādīt detalizētu informāciju par katru grāmatu, piemēram, kas būtu pieejama grāmatu katalogā.

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 izvades rakstīšana

Java nodrošina XML Tranform API lai pārveidotu XML datus. Mēs izmantojam šo API ar identitātes pārveidošana lai radītu izlaidi.

Piemēram, pievienosim jaunu grāmata iepriekš minētā kataloga parauga elements. Grāmatas detaļas (piemēram autors , titulu utt.) var iegūt ārēji, iespējams, no rekvizītu faila vai datu bāzes. Lai ielādētu datus, mēs izmantojam šādu rekvizītu failu.

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.

Pirmais solis ir parsēt esošo XML failu, izmantojot iepriekš aprakstīto metodi. Kods ir parādīts arī zemāk.

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

Mēs ielādējam datus no rekvizītu faila, izmantojot Rekvizīti klase nodrošināta ar java. Kods ir diezgan vienkāršs un parādīts zemāk.

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

Kad rekvizīti ir ielādēti, mēs no rekvizītu faila izgūstam pievienotās vērtības.

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

Tagad izveidosim tukšu grāmata elements.

kāpēc mans dators izmanto 100 disku?
Element book = document.createElement('book');
book.setAttribute('id', id);

Bērnu elementu pievienošana grāmata ir triviāls. Ērtības labad mēs apkopojam nepieciešamos elementu nosaukumus a Saraksts un pievienojiet vērtības cilpā.

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

Un tā tas tiek darīts. The katalogs elementam tagad ir jaunais grāmata pievienots elements. Tagad atliek tikai uzrakstīt atjaunināto XML.

Lai rakstītu XML, mums ir nepieciešams piemērs Transformators kas ir izveidots, kā parādīts zemāk. Ņemiet vērā, ka mēs pieprasām izvades XML atkāpi, izmantojot setOutputProperty () metodi.

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

Pēdējais XML izvades ģenerēšanas posms ir transformācijas pielietošana. Rezultāts parādās izvades plūsmā, System.out .

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

Lai ierakstītu izvadi tieši failā, izmantojiet tālāk norādīto.

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

Un tas noslēdz šo rakstu par XML failu lasīšanu un rakstīšanu, izmantojot DOM API.

Vai esat lietojis DOM API savās lietojumprogrammās? Kā tas darbojās? Lūdzu, informējiet mūs zemāk esošajos komentāros.

Kopīgot Kopīgot Čivināt E -pasts Canon pret Nikon: kurš kameras zīmols ir labāks?

Canon un Nikon ir divi lielākie nosaukumi kameru nozarē. Bet kurš zīmols piedāvā labāku kameru un objektīvu klāstu?

Lasīt Tālāk
Saistītās tēmas
  • Programmēšana
  • Java
Par autoru Džejs Šridhars(Publicēti 17 raksti) Vairāk no Jay Sridhar

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai iegūtu tehniskus padomus, pārskatus, bezmaksas e -grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu