Cum să citiți și să scrieți fișiere XML cu cod

Cum să citiți și să scrieți fișiere XML cu cod

Doriți să aflați cum să citiți și să scrieți un fișier XML din java?





Fișiere XML sunt utilizate pentru o varietate de scopuri, inclusiv stocarea datelor. Înainte ca JSON să devină popular, XML a fost formatul preferat pentru reprezentarea, stocarea și transportul datelor structurate. Chiar dacă popularitatea XML a scăzut în ultimii ani, este posibil să o întâlniți ocazional, deci este important să învățați cum să lucrați cu el din cod.





Java Standard Edition (SE) include API Java pentru procesare XML (JAXP) , care este un termen general care acoperă majoritatea aspectelor procesării XML. Acestea includ:





  • HOTĂRÂRE: Modelul de obiecte document include clase pentru lucrul cu artefacte XML, cum ar fi element, nod, atribute etc. API-ul DOM încarcă documentul XML complet în memorie pentru procesare, deci nu este foarte potrivit pentru lucrul cu fișiere XML mari.
  • SAX: API-ul simplu pentru XML este un algoritm bazat pe evenimente pentru citirea XML. Aici XML este procesat prin declanșarea evenimentelor găsite la citirea XML. Cerințele de memorie pentru utilizarea acestei metode sunt reduse, dar lucrul cu API-ul este mai complex decât lucrul cu DOM.
  • StAX: API-ul Streaming pentru XML este o adăugare recentă la API-urile XML și oferă filtrarea, procesarea și modificarea fluxului XML de înaltă performanță. Deși evită încărcarea întregului document XML în memorie, acesta oferă o arhitectură tip pull mai degrabă decât o arhitectură bazată pe evenimente, astfel încât aplicația este mai ușor de codat și de înțeles decât folosind SAX API.

În acest articol, folosim API DOM pentru a demonstra cum să citiți și să scrieți fișiere XML din java. Vom acoperi celelalte două API-uri în articolele viitoare.

Un exemplu de fișier XML

În scopul acestui articol, demonstrăm conceptele folosind următorul exemplu XML, care poate fi găsit Aici :






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


Ralls, Kim
...

Citirea unui fișier XML

Să ne uităm la pașii de bază necesari pentru citirea unui fișier XML folosind API-ul DOM.

Primul pas este să obțineți o instanță de DocumentBuilder . Generatorul este folosit pentru a analiza documentele XML. Pentru utilizarea de bază, o facem astfel:





eliberează-ne numărul de telefon pentru apelurile primite
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Acum putem încărca întregul document în memorie pornind de la elementul rădăcină XML. În exemplul nostru, este catalog element.

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

Și atât, oameni buni! API-ul DOM pentru citirea unui XML este foarte simplu. Acum aveți acces la întregul document XML începând de la elementul său rădăcină, catalog . Să vedem acum cum să lucrăm cu acesta.





Folosind API-ul DOM

Acum că avem rădăcina XML Element , putem folosi API-ul DOM pentru a extrage nuggets interesante de informații.

Ia toate carte copiii elementului rădăcină și buclați peste ei. Rețineți că getChildNodes () se intoarce toate copii, inclusiv text, comentarii, etc. Pentru scopul nostru, avem nevoie doar de elementele copilului, așa că trecem peste celelalte.

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
}

Cum găsiți un anumit element copil, având în vedere părintele? Următoarea metodă statică returnează primul element de potrivire dacă a fost găsit sau nul. După cum puteți vedea, procedura implică obținerea listei de noduri copil și parcurgerea lor prin selectarea nodurilor elementelor cu numele specificat.

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

Rețineți că API-ul DOM tratează conținutul textului dintr-un element ca un nod separat de tip TEXT_NODE . În plus, conținutul textului ar putea fi împărțit în mai multe noduri text adiacente. Deci, este necesară următoarea procesare specială pentru a prelua conținutul textului dintr-un element.

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

Înarmat cu aceste funcții de comoditate, haideți acum să analizăm câteva coduri pentru listarea unor informații din exemplul nostru XML. Am dori să afișăm informații detaliate pentru fiecare carte, cum ar fi disponibile într-un catalog de cărți.

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

Scrierea ieșirii XML

Java oferă API XML Tranform pentru a transforma date XML. Folosim acest API cu transformarea identității pentru a genera ieșire.

De exemplu, permiteți-ne să adăugăm un nou carte element la catalogul eșantion prezentat mai sus. Detaliile cărții (cum ar fi autor , titlu , etc) pot fi obținute extern, poate dintr-un fișier de proprietăți sau dintr-o bază de date. Folosim următorul fișier de proprietăți pentru a încărca datele.

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.

Primul pas este analizarea fișierului XML existent folosind metoda prezentată mai sus. Codul este, de asemenea, prezentat mai jos.

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

Încărcăm datele din fișierul de proprietăți folosind Proprietăți clasa prevazuta cu java. Codul este destul de simplu și este prezentat mai jos.

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

Odată ce proprietățile sunt încărcate, recuperăm valorile pe care dorim să le adăugăm din fișierul de proprietăți.

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

Să creăm acum un gol carte element.

cum se configurează wifi pe raspberry pi 3
Element book = document.createElement('book');
book.setAttribute('id', id);

Adăugarea elementelor copil la carte este banal. Pentru comoditate, colectăm numele elementelor necesare într-un Listă și adăugați valorile într-o buclă.

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 așa se face. The catalog elementul are acum noul carte element adăugat. Tot ce rămâne acum este să scriem XML-ul actualizat.

Pentru scrierea XML, avem nevoie de o instanță de Transformator care este creat așa cum se arată mai jos. Rețineți că solicităm indentarea XML de ieșire folosind setOutputProperty () metodă.

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

Ultimul pas în generarea ieșirii XML este aplicarea transformării. Rezultatul apare pe fluxul de ieșire, System.out .

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

Pentru a scrie ieșirea direct într-un fișier, utilizați următoarele.

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

Și asta încheie acest articol despre citirea și scrierea fișierelor XML folosind API-ul DOM.

Ați folosit API-ul DOM în aplicațiile dvs.? Cum a funcționat? Vă rugăm să ne anunțați în comentariile de mai jos.

Acțiune Acțiune Tweet E-mail Canon vs. Nikon: Ce marcă de camere este mai bună?

Canon și Nikon sunt cele mai mari două nume din industria camerelor. Dar ce marcă oferă o gamă mai bună de camere și obiective?

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • Java
Despre autor Jay Sridhar(17 articole publicate) Mai multe de la Jay Sridhar

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona