Kako čitati i pisati XML datoteke s kodom

  • Mark Lucas
  • 0
  • 1323
  • 187
Oglas

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

XML datoteke Što je XML datoteka i kako je možete otvoriti i koristiti? Što je XML datoteka i kako je možete otvoriti i koristiti? Možda ste vidjeli pojam "XML." Možda ste slučajno otvorili XML datoteku. Što je XML i kako ga koristiti? koriste se u različite svrhe, uključujući pohranu podataka. Prije nego što je JSON postao popularan, XML je bio preferirani format za predstavljanje, pohranu i transport strukturiranih podataka. Iako se popularnost XML-a posljednjih godina smanjivala, možete je susresti povremeno, zato je važno naučiti raditi s njom iz koda.

Java Standardno izdanje (SE) 10 osnovnih Java koncepata koje biste trebali naučiti pri početku 10 jezgrenih Java koncepata koje biste trebali naučiti kada započeti Bilo da pišete GUI, razvijate softver na strani poslužitelja ili mobilnu aplikaciju putem Androida, učenje Java će poslužiti ti dobro. Evo nekih osnovnih Java koncepata koji će vam pomoći da započnete s radom. Uključuje Java API za XML obradu (JAXP), što je krovni izraz koji pokriva većinu aspekata XML obrade. To uključuje:

  • DOM: Model objekta dokumenta uključuje klase za rad s XML artefaktima kao što su element, čvor, atributi itd. DOM API čitav XML dokument učitava u memoriju na obradu, tako da nije baš prikladan za rad s velikim XML datotekama.
  • SAKSOFON: Simple API for XML algoritam za čitanje XML-a temeljen na događajima. Ovdje se XML obrađuje događajima ispaljivanja koji se nalaze kada čitate XML. Zahtjevi za memoriju za upotrebu ove metode su niski, ali rad s API-om je složeniji od rada s DOM-om.
  • Stax: Streaming API za XML nedavno je dodavanje XML API-jevima i pruža filtriranje, obradu i modifikaciju XML-a visokih performansi. Iako izbjegava učitavanje čitavog XML dokumenta u memoriju, on pruža arhitekturu tipa povučenosti, a ne arhitekturu vođenu događajima, pa je aplikaciju lakše kodirati i razumjeti nego pomoću SAX API-ja.

U ovom članku koristimo DOM API demonstrirati kako čitati i pisati XML datoteke s Java. Ostala dva API-ja pokrivat ćemo u budućim člancima.

Uzorak XML datoteke

U svrhu ovog članka, demonstriramo koncepte pomoću sljedećeg uzorka XML koji možete pronaći ovdje:

   Gambardella, Matthew XML Vodič za programere Računalo 44.95 2000-10-01 Detaljni pregled stvaranja aplikacija s XML-om. Ralls, Kim ... 

Čitanje XML datoteke

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

Prvi korak je dobivanje instance DocumentBuilder. Alat za izgradnju koristi se za analizu XML dokumenata. Za osnovnu upotrebu to radimo ovako:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (lažne); factory.setValidating (lažne); 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.

Datoteka = ...; // XML datoteka za čitanje Document Document = builder.parse (datoteka); Katalog elemenata = document.getDocumentElement (); 

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

Korištenje DOM API-ja

Sad kad imamo XML korijen Element, pomoću DOM API-ja možemo izvući zanimljive elemente informacija.

Dohvati sve knjiga djeca korijenskog elementa i petljaju nad njima. Primjetite to getChildNodes () vraća svi djeca, uključujući tekst, komentare itd. Za našu svrhu su nam potrebni samo dječji elementi, pa preskočimo ostale.

NodeList knjige = catalog.getChildNodes (); za (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  

Kako pronaći određeni podređeni element s obzirom na roditelja? Sljedeća statička metoda vraća prvi odgovarajući element ako se nađe ili je nula. Kao što vidite, postupak uključuje dobivanje popisa podređenih čvorova i petljanje kroz njih odabirom čvorova elemenata s navedenim imenom.

statički privatni čvor findFirstNamedElement (nadređeni čvor, String tagName) NodeList kids = parent.getChildNodes (); za (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;  

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

statički privatni String getCharacterData (roditelj čvora) StringBuilder text = new StringBuilder (); if (parent == null) vraća text.toString (); NodeList kids = parent.getChildNodes (); za (int k = 0, kn = kids.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Naoružani ovim funkcijama pogodnosti, pogledajmo sada neki kod za popis nekih informacija iz našeg XML uzorka. Željeli bismo prikazati detaljne podatke za svaku knjigu, kao što bi bile dostupne u katalogu knjiga.

NodeList knjige = catalog.getChildNodes (); za (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);  

Pisanje XML izlaza

Java pruža XML Tranform API transformirati XML podatke. Ovaj API koristimo s transformacija identiteta generirati izlaz.

Kao primjer, dodajmo novo knjiga element u gore navedenom katalogu uzoraka. Pojedinosti knjige (kao što su Autor, titula, itd.) može se dobiti izvana, možda iz datoteke svojstava ili baze podataka. Za učitavanje podataka koristimo sljedeću datoteku svojstava.

id = bk113 autor = Jane Austen naslov = Ponos i predrasuda žanr = Romantična cijena = 6,99 objavi_date = 2010-04-01 opis = "Istina je općepriznata, da jedan čovjek koji posjeduje dobru sreću mora biti u potrazi za žena." Tako počinje Ponos i predrasude, duhovita komedija Jane Austen o maniri - jedan od najpopularnijih romana svih vremena - koji sadrži sjajno civilizirano spajanje između ponosnog gospodina Darcyja i predrasuda Elizabeth Bennet dok glumi svoje duhovito udvaranje u nizu spletke izvlačenja u osamnaestom stoljeću. 

Prvi korak je raščlaniti postojeću XML datoteku pomoću metode predstavljene gore. Kod je također prikazan u nastavku.

Datoteka = ...; // XML datoteka za čitanje Document Document = builder.parse (datoteka); Katalog elemenata = document.getDocumentElement (); 

Učitavamo podatke iz datoteke svojstava pomoću Nekretnine klase osigurane javom. Kod je vrlo jednostavan i prikazan u nastavku.

String propsFile =…; Profili za svojstva = nova svojstva (); pokušajte (FileReader u = novi FileReader (propsFile)) props.load (in);  

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

String id = props.getProperty ("id"); String author = props.getProperty ("autor"); String title = props.getProperty ("naslov"); String žanr = props.getProperty ("žanr"); String price = props.getProperty ("cijena"); Niz objavljivanja_datoteka = props.getProperty ("objavi_date"); String descr = props.getProperty ("opis"); 

Stvorimo sada prazno knjiga element.

Element knjiga = document.createElement ("knjiga"); book.setAttribute ("id", id); 

Dodavanje podređenih elemenata u knjiga je trivijalno. Radi praktičnosti skupljamo potrebna imena elemenata u a Popis i dodajte vrijednosti u petlju.

Navedi elnames = Arrays.asList ("autor", "naslov", "žanr", "cijena", "objavi_datum", "opis"); for (String elname: elnames) Element el = document.createElement (elname); Tekst teksta = document.createTextNode (props.getProperty (ime)); el.appendChild (tekst); book.appendChild (el);  katalog.appendChild (knjiga); 

I tako se to radi. katalog element sada ima novo knjiga element dodan. Sve što preostaje je pisati ažurirani XML.

Za pisanje XML-a, potrebna nam je instanca Transformator koja se stvara kao što je prikazano u nastavku. Imajte na umu da zahtijevamo uvlačenje izlaznog XML-a pomoću setOutputProperty () način.

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

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

tform.transform (novi DOMSource (dokument), novi StreamResult (System.out)); 

Za pisanje izlaza izravno u datoteku koristite sljedeće.

tform.transform (novi DOMSource (dokument), novi StreamResult (nova datoteka ("output.xml"))); 

A to zaključuje ovaj članak o čitanju i pisanju XML datoteka pomoću DOM API-ja.

Jeste li koristili DOM API u svojim aplikacijama? Kako je nastupila? Javite nam u komentarima u nastavku.




Još ne komentari

O modernoj tehnologiji, jednostavnoj i pristupačnoj.
Vaš vodič u svijetu moderne tehnologije. Naučite kako koristiti tehnologije i uređaje koji nas okružuju svaki dan i naučite kako otkriti zanimljivosti na Internetu.