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 / Programare

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

Fișierele 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 ea din cod.

Java Standard Edition (SE) 10 Concepte Java Core Trebuie să învățați când începeți 10 Concepte Java Core Trebuie să învățați când începeți Fie că scrieți un GUI, dezvoltând software-ul de pe server, sau o aplicație mobilă folosind Android, învățarea Java va servi esti bine. Iată câteva concepte Java core pentru a vă ajuta să începeți. Citește mai mult include Java API pentru procesarea XML (JAXP), care este un termen umbrelă care acoperă majoritatea aspectelor procesării XML. Acestea includ:

  • DOM: Modelul Object Document include clase pentru lucrul cu artefacte XML, cum ar fi elementul, nodul, atributele etc. DOM API încarcă documentul complet XML î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-ului. Aici XML este procesat prin evenimente de tragere găsite atunci când citiți XML. Cerințele de memorie pentru utilizarea acestei metode sunt scăzute, dar lucrul cu API este mai complex decât lucrul cu DOM.
  • Stax: API-ul Streaming pentru XML este o adăugare recentă a API-urilor XML și oferă filtrarea, procesarea și modificarea fluxului de înaltă performanță a XML-ului. În timp ce evită încărcarea întregului document XML în memorie, acesta oferă mai degrabă o arhitectură de tip pull decât o arhitectură bazată pe evenimente, astfel încât aplicația este mai ușor de codificat și de înțeleasă decât să utilizeze API-ul SAX.

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

Un exemplu de fișier XML

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

   Gambardella, Matthew Ghidul dezvoltatorilor XML Calculator 44,95 2000-10-01 O privire aprofundată la crearea de aplicații cu 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 DOM API.

Primul pas este să obții un exemplu de DocumentBuilder. Constructorul este folosit pentru a analiza documentele XML. Pentru utilizarea de bază, o facem astfel:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); Document Builder DocumentBuilder = factory.newDocumentBuilder (); 

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

Fișier fișier = ...; // Fișier XML pentru a citi Document document = builder.parse (fișier); Element catalog = document.getDocumentElement (); 

Și asta e, oameni buni! API-ul DOM pentru citirea unui XML este foarte simplu. Acum aveți acces la întregul document XML pornind de la elementul rădăcină, catalog. Să vedem acum cum să lucrăm cu ea.

Folosind DOM API

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

Obțineți toate carte copii ai elementului rădăcină și bucla peste ele. Rețineți că getChildNodes () se intoarce toate copii, inclusiv text, comentarii etc. Pentru scopul nostru, avem nevoie doar de elementele copilului, astfel încât sămânțăm peste celelalte.

Carti NodeList = catalog.getChildNodes (); pentru (int i = 0, ii = 0, n = books.getLength (); i < n ; 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, dat fiind părintele? Următoarea metodă statică returnează primul element de potrivire dacă este găsit sau null. După cum puteți vedea, procedura implică obținerea listei de noduri copil și looping prin ele selectarea nodurilor de elemente cu numele specificat.

Nodul static privat findFirstNamedElement (Nod parent, String tagName) NodeList copii = parent.getChildNodes (); pentru (int i = 0, in = children.getLength (); i < in ; 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ă DOM API tratează conținutul de text 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, urmatoarea procesare speciala este necesara pentru a prelua continutul textului intr-un element.

static privat String getCharacterData (nod părinte) StringBuilder text = new StringBuilder (); dacă (parent == null) returnează text.toString (); NodeList copii = parent.getChildNodes (); pentru (int k = 0, kn = copii.getLength (); k < kn ; 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 confort, să ne uităm acum la un cod pentru a afișa câteva informații din exemplul nostru XML. Am dori să afișăm informații detaliate pentru fiecare carte, cum ar fi acestea disponibile într-un catalog de cărți.

Carti NodeList = catalog.getChildNodes (); pentru (int i = 0, ii = 0, n = books.getLength (); i < n ; 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\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);  

Scrierea rezultatului XML

Java furnizează XML Tranform API pentru a transforma datele XML. Utilizăm acest API cu transformarea identității pentru a genera ieșire.

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

id = bk113 autor = Jane Austen title = genul Pride and Prejudice = pret romantic = 6.99 publish_date = 2010-04-01 description = "Este adevar universal recunoscut ca un singur om in posesia unei norocuri trebuie sa fie in lipsa o sotie." Așa începe Pride and Prejudice, comedia amuzantă de maniere a lui Jane Austen - unul dintre cele mai populare romane din toate timpurile - care are o splendoare splendid civilizată între mândrul domnul Darcy și prejudecată Elizabeth Bennet, în timp ce își cântă în curând spiritele curte într-o serie de din secolul al XVIII-lea, intrigi de salon. 

Primul pas este să analizăm fișierul XML existent folosind metoda prezentată mai sus. Codul este de asemenea prezentat mai jos.

Fișier fișier = ...; // Fișier XML pentru a citi Document document = builder.parse (fișier); Element catalog = document.getDocumentElement (); 

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

String propsFile = ...; Proprietăți props = new Properties (); încercați (FileReader în = fișierul de fișiere nou (propsFile)) props.load (in);  

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

Id-ul șirului = props.getProperty ("id"); Autorul șirului = props.getProperty ("autor"); Nume șir = props.getProperty ("titlu"); String gen = props.getProperty ("gen"); Prețul șirului = props.getProperty ("preț"); String public_date = props.getProperty ("publish_date"); Șirul descr = props.getProperty ("descriere"); 

Să creăm acum un gol carte element.

Element book = document.createElement ("carte"); 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 ("autor", "titlu", "gen", "preț", "publicare_date", "descriere"); pentru (eșantionul String: elnames) Element el = document.createElement (elname); Textul textului = document.createTextNode (props.getProperty (elname)); el.appendChild (text); book.appendChild (el);  catalog.appendChild (carte); 

Și așa se face. catalog elementul are acum noul carte element adăugat. Tot ce rămâne acum este să scrieți XML actualizat.

Pentru scrierea XML, avem nevoie de un exemplu de Transformator care este creat după cum se arată mai jos. Rețineți că cerem indentarea XML de ieșire folosind setOutputProperty () metodă.

TransformerFactory tfact = TransformerFactory.newInstance (); Forma transformatorului = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "da"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

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

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

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

tform.transform (noua DOMSource (document), nou StreamResult (fișier nou ("output.xml"))); 

Și acest lucru împachetează acest articol pe citirea și scrierea fișierelor XML folosind DOM API.

Ați folosit API-ul DOM în aplicațiile dvs.? Cum a funcționat? Spuneți-ne în comentariile de mai jos.

Explorați mai multe despre: Java.