Oglas

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

XML datoteke Što je XML datoteka i kako je možete otvoriti i koristiti?Možda ste vidjeli izraz "XML". Možda ste čak slučajno otvorili XML datoteku. Što je XML i kako ga koristite? Čitaj više koriste se u razne svrhe uključujući pohranu podataka. Prije nego što je JSON postao popularan, XML je bio preferirani format za predstavljanje, pohranu i prijenos strukturiranih podataka. Iako je popularnost XML-a oslabila posljednjih godina, možete ga povremeno susresti pa je važno naučiti kako raditi s njim iz koda.

Java standardno izdanje (SE) 10 osnovnih Java koncepata koje biste trebali naučiti kada počneteBilo da pišete GUI, razvijate softver na strani poslužitelja ili mobilnu aplikaciju koristeći Android, učenje Jave dobro će vam poslužiti. Evo nekoliko osnovnih Java koncepata koji će vam pomoći da započnete. Čitaj više uključuje Java API za XML obradu (JAXP), što je krovni pojam koji pokriva većinu aspekata XML obrade. To uključuje:

instagram viewer
  • DOM: Objektni model dokumenta uključuje klase za rad s XML artefaktima kao što su element, čvor, atributi itd. DOM API učitava cijeli XML dokument u memoriju za obradu, tako da nije baš prikladan za rad s velikim XML datotekama.
  • SAKSOFON: Simple API za XML je algoritam za čitanje XML-a vođen događajima. Ovdje se XML obrađuje pokretanjem događaja pronađenih prilikom čitanja XML-a. Zahtjevi za memorijom za korištenje ove metode su mali, ali rad s API-jem je složeniji od rada s DOM-om.
  • Stax: Streaming API za XML novi je dodatak XML API-jima i pruža visokoučinkovito filtriranje toka, obradu i modifikaciju XML-a. Iako izbjegava učitavanje cijelog XML dokumenta u memoriju, radije pruža arhitekturu tipa povlačenja nego arhitektura vođena događajima, pa je aplikaciju lakše kodirati i razumjeti nego koristiti SAX API.

U ovom članku koristimo se DOM API pokazati kako čitati i pisati XML datoteke iz java. Ostala dva API-ja ćemo pokriti u budućim člancima.

Uzorak XML datoteke

Za potrebe ovog članka, demonstriramo koncepte koristeći sljedeći primjer XML-a koji se može pronaći ovdje:

 1.0?>Gambardella, MatthewXML vodič za razvojne programere
Računalo44.952000-10-01Detaljan pogled na stvaranje 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 nabaviti primjerak DocumentBuilder. Graditelj se koristi za raščlanjivanje XML dokumenata. Za osnovnu upotrebu to radimo ovako:

Tvornica DocumentBuilderFactory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); Graditelj dokumenata = tvornica.noviDokumentBuilder(); 

Sada možemo učitati cijeli dokument u memoriju počevši od XML korijenskog elementa. U našem primjeru, to je katalog element.

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

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

Korištenje DOM API-ja

Sada kada imamo XML root Element, možemo koristiti DOM API za izdvajanje zanimljivih grumena informacija.

Uzmi sve knjiga djeca korijenskog elementa i petlja preko njih. Imajte na umu da getChildNodes() vraća svi djeca, uključujući tekst, komentare itd. Za našu svrhu trebaju nam samo podređeni elementi, pa preskačemo ostale.

Popis čvorova knjige = catalog.getChildNodes(); za (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Čvor. ELEMENT_NODE ) nastavak; Knjiga elemenata = (Element) dijete; // rad s knjigom Element ovdje. }

Kako pronaći određeni podređeni element, s obzirom na roditelj? Sljedeća statička metoda vraća prvi odgovarajući element ako je pronađen, ili null. Kao što možete vidjeti, postupak uključuje dobivanje popisa podređenih čvorova i petlju kroz njih birajući čvorove elementa s navedenim imenom.

statički privatni čvor findFirstNamedElement (roditelj čvora, string tagName) { Djeca Liste čvorova = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < in; i++) { Node child = children.item (i); if ( child.getNodeType() != Čvor. ELEMENT_NODE ) nastavak; if ( child.getNodeName().equals (tagName) ) return child; } vrati null; }

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

statički privatni string getCharacterData (roditelj čvora) { StringBuilder text = new StringBuilder(); if ( roditelj == null ) vrati tekst.toString(); Djeca Liste čvorova = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Node child = children.item (k); if ( child.getNodeType() != Čvor. TEXT_NODE ) prekid; text.append (child.getNodeValue()); } vrati tekst.toString(); }

Naoružani ovim praktičnim funkcijama, pogledajmo sada neki kod za navođenje nekih informacija iz našeg uzorka XML-a. Željeli bismo prikazati detaljne informacije za svaku knjigu, kao što bi bile dostupne u katalogu knjiga.

Popis čvorova knjige = catalog.getChildNodes(); za (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Čvor. ELEMENT_NODE ) nastavak; Knjiga elemenata = (Element) dijete; ii++; String id = book.getAttribute("id"); Autor niza = getCharacterData (findFirstNamedElement (dijete,"autor")); Naslov niza = getCharacterData (findFirstNamedElement (dijete,"title")); Žanr niza = getCharacterData (findFirstNamedElement (dijete,"žanr")); Cijena niza = getCharacterData (findFirstNamedElement (dijete, "cijena")); String pubdate = getCharacterData (findFirstNamedElement (dijete,"pubdate")); String descr = getCharacterData (findFirstNamedElement (dijete, "opis")); System.out.printf("%3d. id knjige = %s\n" + " autor: %s\n" + " naslov: %s\n" + " žanr: %s\n" + " cijena: %s\n" + " izdanje: %s \n" + " descr: %s\n", ii, id, autor, naslov, žanr, cijena, izdanje, descr); }

Pisanje XML izlaza

Java pruža API za XML transformaciju transformirati XML podatke. Ovaj API koristimo s transformacija identiteta za generiranje izlaza.

Kao primjer, dodajmo novi knjiga element u gore prikazanom uzorku kataloga. Detalji knjige (npr 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. title=Ponos i predrasude. žanr=Romantika. cijena=6,99. publish_date=2010-04-01. description="Općepriznata je istina da samac koji posjeduje bogatstvo mora biti u nedostatku žene." Tako počinje Pride i Predrasude, duhovita komedija ponašanja Jane Austen - jedan od najpopularnijih romana svih vremena - koja prikazuje sjajno civilizirane svađe između ponosni gospodin Darcy i Elizabeth Bennet s predrasudama dok igraju svoje živahno udvaranje u nizu salona iz osamnaestog stoljeća spletke. 

Prvi korak je raščlanjivanje postojeće XML datoteke korištenjem gore prikazane metode. Kod je također prikazan u nastavku.

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

Učitavamo podatke iz datoteke svojstava pomoću Svojstva klasa s java. Kod je prilično jednostavan i prikazan je u nastavku.

String propsFile =...; Svojstva rekviziti = nova svojstva(); pokušaj (FileReader in = new FileReader (propsFile)) { props.load (in); }

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

String id = props.getProperty("id"); Autor stringa = props.getProperty("autor"); Naslov niza = props.getProperty("title"); String žanr = props.getProperty("žanr"); Cijena niza = props.getProperty("cijena"); String publish_date = props.getProperty("publish_date"); String descr = props.getProperty("opis"); 

Kreirajmo sada prazno knjiga element.

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

Dodavanje podređenih elemenata u knjiga je trivijalan. Radi praktičnosti skupljamo potrebna imena elemenata u a Popis i dodaj vrijednosti u petlji.

Popiselnames =Arrays.asList("autor", "naslov", "žanr", "cijena", "datum_objave", "opis"); for (String elname: elnames) { Element el = document.createElement (elname); Tekst teksta = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendChild (el); } catalog.appendChild (knjiga);

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

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

TransformerFactory tfact = TransformerFactory.newInstance(); Transformator tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. INDETA, "da"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Posljednji korak u generiranju XML izlaza je primjena transformacije. Rezultat se pojavljuje na izlaznom toku, Sustav.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"))); 

I to završava ovaj članak o čitanju i pisanju XML datoteka pomoću DOM API-ja.

Jeste li koristili DOM API u svojim aplikacijama? Kako se izveo? Obavijestite nas u komentarima ispod.