Werken met XML-bestanden in Java met behulp van DOM-parsing

1. Overzicht

In deze tutorial bespreken we hoe je DOM kunt parseren met Apache Xerces - een volwassen en gevestigde bibliotheek voor het parseren / manipuleren van XML.

Er zijn meerdere opties om een ​​XML-document te ontleden; we zullen ons in dit artikel concentreren op DOM-parsing. De DOM-parser laadt een document en maakt een volledige hiërarchische boom in het geheugen.

Raadpleeg ons vorige artikel voor een overzicht van de ondersteuning van XML-bibliotheken in Java.

2. Ons document

Laten we beginnen met het XML-document dat we in ons voorbeeld gaan gebruiken:

   Guava Introductie tot Guava 04/04/2016 GuavaAuthor ... 

Merk op dat ons document een hoofdknooppunt heeft genaamd “tutorials” met 4 “tutorial” onderliggende knooppunten. Elk van deze heeft 2 attributen: "tutId" en "type". Bovendien heeft elke "tutorial" 4 onderliggende knooppunten: "titel", "beschrijving", "datum" en "auteur".

Nu kunnen we doorgaan met het ontleden van dit document.

3. XML-bestand laden

Ten eerste moeten we dat opmerken de Apache Xerces-bibliotheek wordt geleverd met de JDK, dus we hebben geen extra instellingen nodig.

Laten we meteen beginnen met het laden van ons XML-bestand:

DocumentBuilder-builder = DocumentBuilderFactory.newInstance (). NewDocumentBuilder (); Document doc = builder.parse (nieuw bestand ("src / test / resources / voorbeeld_jdom.xml")); doc.getDocumentElement (). normalize ();

In het bovenstaande voorbeeld krijgen we eerst een instantie van de DocumentBuilder class, gebruik dan de ontleden () methode op het XML-document om een Document object dat het vertegenwoordigt.

We moeten ook de normaliseren () methode om ervoor te zorgen dat de documenthiërarchie niet wordt beïnvloed door extra witruimten of nieuwe regels binnen knooppunten.

4. Het ontleden van de DOM

Laten we nu ons XML-bestand verkennen.

Laten we beginnen met het ophalen van alle elementen met de tag "tutorial". We kunnen dit doen met behulp van de getElementsByTagName () methode, die een Knooppuntlijst:

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

Het is belangrijk om dat op te merken Knooppunt is het primaire datatype voor de DOM-componenten. Alle elementen, attributen en tekst worden als knooppunten beschouwd.

Laten we vervolgens kijken hoe we de attributen van het eerste element kunnen krijgen met behulp van 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 ("type", attrList.item (1) .getNodeName ()); assertEquals ("java", attrList.item (1) .getNodeValue ()); }

Hier krijgen we de NamedNodeMap object en gebruik vervolgens de item (index) methode om elk knooppunt op te halen.

Voor elk knooppunt kunnen we getNodeName () en getNodeValue () om hun attributen te vinden.

5. Overstekende knooppunten

Laten we vervolgens kijken hoe we DOM-knooppunten kunnen doorkruisen.

In de volgende test zullen we de onderliggende knooppunten van het eerste element doorlopen en hun inhoud afdrukken:

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

Ten eerste krijgen we de NodeList de ... gebruiken getChildNodes () methode, herhaal het vervolgens en druk de knooppuntnaam en tekstinhoud af.

De uitvoer toont de inhoud van het eerste "tutorial" -element in ons document:

titel: Guava beschrijving: Inleiding tot Guava datum: 04/04/2016 auteur: GuavaAuthor

6. Wijziging van de DOM

We kunnen ook wijzigingen aanbrengen in de DOM.

Laten we als voorbeeld de waarde van de type attribuut van "java" naar "andere":

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

Hier is het wijzigen van de attribuutwaarde een eenvoudige kwestie van een Element‘S setAttribute () methode.

7. Een nieuw document aanmaken

Naast het aanpassen van de DOM, kunnen we ook vanuit het niets nieuwe XML-documenten maken.

Laten we eerst eens kijken naar het bestand dat we willen maken:

   [e-mail beveiligd] 

Onze XML bevat een gebruikers root-knooppunt met één gebruiker element dat ook een kindknooppunt heeft e-mail.

Om dit te bereiken moeten we eerst bellen met het Bouwer‘S nieuw document() methode die een Document voorwerp.

Dan bellen we de createElement () methode van het nieuwe object:

@Test openbare leegte whenCreateNewDocument_thenCreated () gooit Uitzondering {Document newDoc = builder.newDocument (); Element root = newDoc.createElement ("gebruikers"); newDoc.appendChild (root); Element first = newDoc.createElement ("gebruiker"); root.appendChild (eerste); first.setAttribute ("id", "1"); Element email = newDoc.createElement ("email"); email.appendChild (newDoc.createTextNode ("[email protected]")); first.appendChild (e-mail); assertEquals (1, newDoc.getChildNodes (). getLength ()); assertEquals ("gebruikers", newDoc.getChildNodes (). item (0) .getNodeName ()); }

Om elk element aan de DOM toe te voegen, noemen we ook de appendChild () methode.

8. Een document opslaan

Nadat we ons document hebben aangepast of helemaal opnieuw hebben gemaakt, moeten we het opslaan in een bestand.

We beginnen met het maken van een DOMSource object, gebruik dan een eenvoudig Transformator om het document in een bestand op te slaan:

private void saveDomToFile (Document document, String bestandsnaam) genereert Uitzondering {DOMSource dom = nieuwe DOMSource (document); Transformator transformator = TransformerFactory.newInstance () .newTransformer (); StreamResult resultaat = nieuw StreamResult (nieuw bestand (bestandsnaam)); transformer.transform (dom, resultaat); }

Op dezelfde manier kunnen we ons document in de console afdrukken:

private void printDom (document document) gooit uitzondering {DOMSource dom = nieuwe DOMSource (document); Transformator transformator = TransformerFactory.newInstance () .newTransformer (); transformer.transform (dom, nieuwe StreamResult (System.out)); }

9. Conclusie

In dit korte artikel hebben we geleerd hoe we de Xerces DOM-parser kunnen gebruiken om een ​​XML-document te maken, te wijzigen en op te slaan.

Zoals altijd is de volledige broncode voor de voorbeelden beschikbaar op GitHub.


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