Rad s XML datotekama u Javi pomoću DOM raščlanjivanja

1. Pregled

U ovom uputstvu razgovarat ćemo o analizi DOM-a s Apache Xerces - zrelom i uspostavljenom knjižnicom za raščlanjivanje / manipulaciju XML-om.

Postoji više mogućnosti za raščlanjivanje XML dokumenta; u ovom ćemo se članku usredotočiti na raščlanjivanje DOM-a. DOM parser učitava dokument i stvara cijelo hijerarhijsko stablo u memoriji.

Pregled podrške za XML knjižnice u Javi potražite u našem prethodnom članku.

2. Naš dokument

Počnimo s XML dokumentom koji ćemo koristiti u našem primjeru:

   Guava Uvod u Guavu 04/04/2016 GuavaAuthor ... 

Imajte na umu da naš dokument ima korijenski čvor nazvan "tutoriali" s 4 podređena čvora "tutorial". Svaki od njih ima 2 atributa: "tutId" i "type". Također, svaki "vodič" ima 4 podređena čvora: "naslov", "opis", "datum" i "autor".

Sada možemo nastaviti s raščlanjivanjem ovog dokumenta.

3. Učitavanje XML datoteke

Prvo, to bismo trebali primijetiti knjižnica Apache Xerces pakirana je uz JDK, pa nam ne trebaju dodatna podešavanja.

Krenimo odmah u učitavanje naše XML datoteke:

Builder DocumentBuilder = DocumentBuilderFactory.newInstance (). NewDocumentBuilder (); Dokument doc = builder.parse (nova datoteka ("src / test / resources / example_jdom.xml")); doc.getDocumentElement (). normalize ();

U gornjem primjeru prvo dobivamo primjerak DocumentBuilder razreda, a zatim upotrijebite raščlaniti () metodom na XML dokumentu da biste dobili Dokument objekt koji ga predstavlja.

Također moramo koristiti normalizirati () metoda koja osigurava da na hijerarhiju dokumenta ne utječu dodatni razmaci ili novi redovi unutar čvorova.

4. Raščlanjivanje DOM-a

Sada, istražimo našu XML datoteku.

Počnimo s dohvaćanjem svih elemenata s oznakom "tutorial". To možemo učiniti pomoću getElementsByTagName () metoda koja će vratiti a NodeList:

@Test public void whenGetElementByTag_thenSuccess () {NodeList nodeList = doc.getElementsByTagName ("tutorial"); Prvo čvor = nodeList.item (0); assertEquals (4, nodeList.getLength ()); assertEquals (Node.ELEMENT_NODE, first.getNodeType ()); assertEquals ("tutorial", first.getNodeName ()); }

Važno je to napomenuti Čvor je primarni tip podataka za DOM komponente. Svi se elementi, atributi, tekst smatraju čvorovima.

Dalje, pogledajmo kako možemo dobiti atribute prvog elementa pomoću getAttributes ():

@Test public void whenGetFirstElementAttributes_thenSuccess () {Node first = doc.getElementsByTagName ("tutorial"). Item (0); NamedNodeMap attrList = first.getAttributes (); assertEquals (2, attrList.getLength ()); assertEquals ("tutId", attrList.item (0) .getNodeName ()); assertEquals ("01", attrList.item (0) .getNodeValue ()); assertEquals ("vrsta", attrList.item (1) .getNodeName ()); assertEquals ("java", attrList.item (1) .getNodeValue ()); }

Evo, dobili smo NamedNodeMap objekt, a zatim upotrijebite stavka (indeks) metoda za dohvaćanje svakog čvora.

Za svaki čvor možemo koristiti getNodeName () i getNodeValue () pronaći njihove atribute.

5. Prelazak čvorova

Dalje, pogledajmo kako prelaziti DOM čvorove.

U sljedećem ćemo testu preći podređene čvorove prvog elementa i ispisati njihov sadržaj:

@Test public void whenTraverseChildNodes_thenSuccess () {Node first = doc.getElementsByTagName ("tutorial"). Item (0); NodeList nodeList = first.getChildNodes (); int n = nodeList.getLength (); Struja čvora; za (int i = 0; i

Prvo, dobivamo NodeList koristiti getChildNodes () metodu, zatim je pređite i ispišite naziv čvora i sadržaj teksta.

Izlaz će prikazati sadržaj prvog elementa "tutorial" u našem dokumentu:

naslov: Opis Guave: Uvod u Guavu datum: 04.04.2016. autor: GuavaAuthor

6. Izmjena DOM-a

Također možemo unijeti promjene u DOM.

Kao primjer, promijenimo vrijednost tip atribut iz "java" u "drugo":

@Test public void whenModifyDocument_thenModified () {NodeList nodeList = doc.getElementsByTagName ("tutorial"); Element prvi = (Element) nodeList.item (0); assertEquals ("java", first.getAttribute ("type")); first.setAttribute ("vrsta", "ostalo"); assertEquals ("ostalo", first.getAttribute ("vrsta")); }

Ovdje je promjena vrijednosti atributa jednostavna stvar pozivanja Element‘S setAttribute () metoda.

7. Izrada novog dokumenta

Osim izmjene DOM-a, također možemo stvoriti nove XML dokumente ispočetka.

Pogledajmo prvo datoteku koju želimo stvoriti:

   [e-pošta zaštićena] 

Naš XML sadrži korisnika korijenski čvor s jednim korisnik element koji također ima podređeni čvor e-mail.

Da bismo to postigli, prvo moramo nazvati Graditelj‘S newDocument () metoda koja vraća a Dokument objekt.

Tada ćemo nazvati createElement () metoda novog objekta:

@Test public void whenCreateNewDocument_thenCreated () baca iznimku {Document newDoc = builder.newDocument (); Korijen elementa = newDoc.createElement ("korisnici"); newDoc.appendChild (korijen); Element prvi = newDoc.createElement ("korisnik"); root.appendChild (prvi); first.setAttribute ("id", "1"); Element e-adresa = newDoc.createElement ("e-pošta"); email.appendChild (newDoc.createTextNode ("[e-pošta zaštićena]")); first.appendChild (e-pošta); assertEquals (1, newDoc.getChildNodes (). getLength ()); assertEquals ("korisnici", newDoc.getChildNodes (). item (0) .getNodeName ()); }

Da bismo dodali svaki element u DOM, pozivamo i appendChild () metoda.

8. Spremanje dokumenta

Nakon što izmijenimo naš dokument ili ga napravimo ispočetka, morat ćemo ga spremiti u datoteku.

Počet ćemo s izradom a DOMSource objekt, a zatim upotrijebite jednostavan Transformator za spremanje dokumenta u datoteku:

private void saveDomToFile (dokument dokumenta, stringName file) baca iznimku {DOMSource dom = novi DOMSource (dokument); Transformatorski transformator = TransformerFactory.newInstance () .newTransformer (); Rezultat StreamResult = novi StreamResult (nova datoteka (ime datoteke)); transformer.transform (dom, rezultat); }

Slično tome, svoj dokument možemo ispisati u konzoli:

private void printDom (dokument dokumenta) baca iznimku {DOMSource dom = novi DOMSource (dokument); Transformatorski transformator = TransformerFactory.newInstance () .newTransformer (); transformer.transform (dom, novi StreamResult (System.out)); }

9. Zaključak

U ovom smo kratkom članku naučili kako koristiti Xerces DOM parser za stvaranje, izmjenu i spremanje XML dokumenta.

Kao i uvijek, puni izvorni kod za primjere dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found