Arbejde med XML-filer i Java ved hjælp af DOM-parsing

1. Oversigt

I denne vejledning diskuterer vi, hvordan man analyserer DOM med Apache Xerces - et modent og etableret bibliotek til parsing / manipulation af XML.

Der er flere muligheder for at analysere et XML-dokument; vi fokuserer på DOM-parsing i denne artikel. DOM-parseren indlæser et dokument og opretter et helt hierarkisk træ i hukommelsen.

For en oversigt over understøttelse af XML-biblioteker i Java, se vores tidligere artikel.

2. Vores dokument

Lad os starte med det XML-dokument, vi skal bruge i vores eksempel:

   Guava Introduktion til Guava 04/04/2016 Guava Forfatter ... 

Bemærk, at vores dokument har en rodknude kaldet "tutorials" med 4 "tutorial" underordnede noder. Hver af disse har to attributter: “tutId” og “type”. Hver "tutorial" har også fire underknudepunkter: "titel", "beskrivelse", "dato" og "forfatter".

Nu kan vi fortsætte med at analysere dette dokument.

3. Indlæser XML-fil

Først skal vi bemærke det Apache Xerces-biblioteket er pakket med JDK, så vi har ikke brug for yderligere opsætning.

Lad os hoppe lige ind i at indlæse vores XML-fil:

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 af DocumentBuilder klasse, og brug derefter parse () metode på XML-dokumentet for at få en Dokument objekt, der repræsenterer det.

Vi har også brug for normalisere () metode til at sikre, at dokumenthierarkiet ikke påvirkes af ekstra hvide mellemrum eller nye linjer inden for noder.

4. Parsing af DOM

Lad os nu udforske vores XML-fil.

Lad os starte med at hente alle elementer med tag "tutorial". Vi kan gøre dette ved hjælp af getElementsByTagName () metode, som returnerer en NodeListe:

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

Det er vigtigt at bemærke det Node er den primære datatype for DOM-komponenterne. Alle elementer, attributter, tekst betragtes som noder.

Lad os derefter se, hvordan vi kan få det første elements attributter ved hjælp af getAttributter ():

@Test offentlig ugyldig nårGetFirstElementAttributes_thenSuccess () {Node først = doc.getElementsByTagName ("tutorial"). Element (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 brug derefter vare (indeks) metode til at hente hver node.

For hver knude kan vi bruge getNodeName () og getNodeValue () for at finde deres attributter.

5. Traversing Nodes

Lad os derefter se, hvordan man krydser DOM-noder.

I den følgende test krydser vi det første elements underordnede noder og udskriver deres indhold:

@Test offentlig ugyldig nårTraverseChildNodes_thenSuccess () {Node først = doc.getElementsByTagName ("tutorial"). Element (0); NodeList nodeList = first.getChildNodes (); int n = nodeList.getLength (); Node nuværende; for (int i = 0; i

Først får vi NodeListe bruger getChildNodes () metode, gentag derefter den og udskriv nodenavnet og tekstindholdet.

Outputtet viser indholdet af det første "tutorial" -element i vores dokument:

titel: Guava beskrivelse: Introduktion til Guava dato: 04-04-2016 forfatter: GuavaAuthor

6. Ændring af DOM

Vi kan også foretage ændringer i DOM.

Lad os som et eksempel ændre værdien af type attribut fra "java" til "andet":

@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", "andet"); assertEquals ("andet", first.getAttribute ("type")); }

Her er det enkelt at ændre en attributværdi at kalde en Element'S setAttribute () metode.

7. Oprettelse af et nyt dokument

Udover at ændre DOM kan vi også oprette nye XML-dokumenter fra bunden.

Lad os først se på den fil, vi vil oprette:

   [e-mail beskyttet] 

Vores XML indeholder en brugere rodknude med en bruger element, der også har en undernode e-mail.

For at opnå dette skal vi først kalde Bygger'S newDocument () metode, der returnerer en Dokument objekt.

Så ringer vi til createElement () metode til det nye objekt:

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

For at tilføje hvert element til DOM kalder vi også appendChild () metode.

8. Gemme et dokument

Efter at have ændret vores dokument eller oprettet et fra bunden, skal vi gemme det i en fil.

Vi starter med at oprette en DOMSource objekt, og brug derefter et simpelt Transformer for at gemme dokumentet i en fil:

privat ugyldigt saveDomToFile (dokumentdokument, streng filnavn) kaster undtagelse {DOMSource dom = ny DOMSource (dokument); Transformer transformer = TransformerFactory.newInstance () .newTransformer (); StreamResult resultat = nyt StreamResult (ny fil (filnavn)); transformer.transform (dom, resultat); }

På samme måde kan vi udskrive vores dokument i konsollen:

privat ugyldigt printDom (dokumentdokument) kaster undtagelse {DOMSource dom = ny DOMSource (dokument); Transformer transformer = TransformerFactory.newInstance () .newTransformer (); transformer.transform (dom, ny StreamResult (System.out)); }

9. Konklusion

I denne hurtige artikel lærte vi, hvordan man bruger Xerces DOM-parseren til at oprette, ændre og gemme et XML-dokument.

Som altid er den fulde kildekode til eksemplerne tilgængelig på GitHub.


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