Arbeide med XML-filer i Java ved hjelp av DOM-parsing

1. Oversikt

I denne opplæringen vil vi diskutere hvordan du analyserer DOM med Apache Xerces - et modent og etablert bibliotek for parsing / manipulering av XML.

Det er flere alternativer for å analysere et XML-dokument; Vi fokuserer på DOM-analyse i denne artikkelen. DOM-parseren laster inn et dokument og lager et helt hierarkisk tre i minnet.

For en oversikt over XML-biblioteksstøtte i Java, se vår forrige artikkel.

2. Dokumentet vårt

La oss starte med XML-dokumentet vi skal bruke i eksemplet vårt:

   Guava Introduksjon til Guava 04/04/2016 Guava Forfatter ... 

Merk at dokumentet vårt har en rotnode kalt "tutorials" med 4 "tutorial" -noder. Hver av disse har to attributter: “tutId” og “type”. Hver "tutorial" har også fire underordnede noder: "title", "description", "date" og "author".

Nå kan vi fortsette med å analysere dette dokumentet.

3. Laster inn XML-fil

Først skal vi merke oss det Apache Xerces-biblioteket er pakket med JDK, slik at vi ikke trenger noe ekstra oppsett.

La oss hoppe rett inn i å laste inn XML-filen vår:

DocumentBuilder builder = DocumentBuilderFactory.newInstance (). NewDocumentBuilder (); Dokument doc = builder.parse (ny fil ("src / test / resources / example_jdom.xml")); doc.getDocumentElement (). normalisere ();

I eksemplet ovenfor får vi først en forekomst av DocumentBuilder klasse, bruk deretter analysere () metode på XML-dokumentet for å få en Dokument objekt som representerer det.

Vi må også bruke normalisere () metode for å sikre at dokumenthierarkiet ikke påvirkes av ekstra hvite mellomrom eller nye linjer i noder.

4. Analyse av DOM

La oss nå utforske XML-filen vår.

La oss starte med å hente alle elementene med taggen "tutorial". Vi kan gjøre dette ved hjelp av getElementsByTagName () metode, som vil returnere a NodeListe:

@Test offentlig ugyldig nårGetElementByTag_thenSuccess () {NodeList nodeList = doc.getElementsByTagName ("tutorial"); Node først = nodeList.item (0); assertEquals (4, nodeList.getLength ()); assertEquals (Node.ELEMENT_NODE, first.getNodeType ()); assertEquals ("tutorial", first.getNodeName ()); }

Det er viktig å merke seg det Node er den primære datatypen for DOM-komponentene. Alle elementene, attributtene, teksten betraktes som noder.

Deretter, la oss se hvordan vi kan få det første elementets attributter ved hjelp av getAttributter ():

@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 ("type", attrList.item (1) .getNodeName ()); assertEquals ("java", attrList.item (1) .getNodeValue ()); }

Her får vi NamedNodeMap objekt, og bruk deretter vare (indeks) metode for å hente hver node.

For hver node kan vi bruke getNodeName () og getNodeValue () for å finne egenskapene deres.

5. Kryssende noder

La oss deretter se hvordan du kan krysse DOM-noder.

I den følgende testen vil vi krysse det første elementets undernoder og skrive ut innholdet:

@Test public void whenTraverseChildNodes_thenSuccess () {Node first = doc.getElementsByTagName ("tutorial"). Item (0); NodeList nodeList = first.getChildNodes (); int n = nodeList.getLength (); Node nåværende; for (int i = 0; i

Først får vi NodeList bruker getChildNodes () metode, deretter gjentar du den, og skriver ut nodenavnet og tekstinnholdet.

Utgangen viser innholdet i det første "tutorial" -elementet i dokumentet vårt:

tittel: Guava beskrivelse: Introduksjon til Guava dato: 04.04.2016 forfatter: GuavaForfatter

6. Endring av DOM

Vi kan også gjøre endringer i DOM.

La oss for eksempel endre verdien på type attributt fra “java” til “annet”:

@Test offentlig ugyldig nårModifyDocument_thenModified () {NodeList nodeList = doc.getElementsByTagName ("tutorial"); Element først = (Element) nodeList.item (0); assertEquals ("java", first.getAttribute ("type")); first.setAttribute ("type", "annet"); assertEquals ("annet", first.getAttribute ("type")); }

Her er det å endre attributtverdien en enkel sak å kalle en Element‘S setAttribute () metode.

7. Opprette et nytt dokument

I tillegg til å modifisere DOM, kan vi også opprette nye XML-dokumenter fra bunnen av.

La oss først se på filen vi vil lage:

   [e-postbeskyttet] 

Vår XML inneholder en brukere rotnode med en bruker element som også har en undernode e-post.

For å oppnå dette må vi først ringe Bygger‘S newDocument () metode som returnerer a Dokument gjenstand.

Så vil vi ringe createElement () metoden til det nye objektet:

@Test offentlig ugyldig nårCreateNewDocument_thenCreated () kaster unntak {Document newDoc = builder.newDocument (); Elementrot = newDoc.createElement ("brukere"); newDoc.appendChild (root); Element først = newDoc.createElement ("bruker"); root.appendChild (første); first.setAttribute ("id", "1"); Element e-post = newDoc.createElement ("e-post"); email.appendChild (newDoc.createTextNode ("[email protected]")); first.appendChild (e-post); assertEquals (1, newDoc.getChildNodes (). getLength ()); assertEquals ("brukere", newDoc.getChildNodes (). element (0) .getNodeName ()); }

For å legge til hvert element i DOM, kaller vi også appendChild () metode.

8. Lagre et dokument

Etter å ha endret dokumentet eller opprettet et fra bunnen av, må vi lagre det i en fil.

Vi begynner med å lage en DOMSource objekt, og bruk deretter en enkel Transformator for å lagre dokumentet i en fil:

privat tomrom saveDomToFile (dokumentdokument, streng filnavn) kaster unntak {DOMSource dom = ny DOMSource (dokument); Transformator transformator = TransformerFactory.newInstance () .newTransformer (); StreamResult resultat = ny StreamResult (ny fil (filnavn)); transformer.transform (dom, resultat); }

På samme måte kan vi skrive ut dokumentet vårt i konsollen:

privat tomrom printDom (Dokumentdokument) kaster Unntak {DOMSource dom = ny DOMSource (dokument); Transformator transformator = TransformerFactory.newInstance () .newTransformer (); transformer.transform (dom, ny StreamResult (System.out)); }

9. Konklusjon

I denne raske artikkelen lærte vi hvordan vi bruker Xerces DOM-parser for å opprette, endre og lagre et XML-dokument.

Som alltid er hele kildekoden for eksemplene tilgjengelig på GitHub.


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