XML-bestanden lezen en schrijven met code
Wilt u leren hoe u een XML-bestand van Java kunt lezen en schrijven??
XML-bestanden worden voor verschillende doeleinden gebruikt, waaronder opslag van gegevens. Voordat JSON populair werd, was XML de voorkeursindeling voor het weergeven, opslaan en transporteren van gestructureerde gegevens. Hoewel de populariteit van XML de afgelopen jaren is afgenomen, kun je dit af en toe tegenkomen, dus het is belangrijk om er vanaf code mee te leren werken.
Java Standard Edition (SE) 10 Core Java-concepten die u moet leren als u aan de slag gaat 10 Kern Java-concepten die u moet leren wanneer u aan de slag gaat Of u nu een GUI aan het schrijven bent, software op de server of een mobiele toepassing met Android ontwikkelt, het leren van Java zal dienen goed. Hier zijn enkele kern-Java-concepten om u te helpen aan de slag te gaan. Meer lezen omvat de Java API voor XML-verwerking (JAXP), Dit is een verzamelnaam voor de meeste aspecten van XML-verwerking. Waaronder:
- DOM: Het Document Object Model bevat klassen voor het werken met XML-artefacten zoals element, knooppunt, attributen, etc. De DOM API laadt het volledige XML-document in het geheugen voor verwerking, dus het is niet erg geschikt voor het werken met grote XML-bestanden.
- SAX: De eenvoudige API voor XML is een door gebeurtenissen gestuurd algoritme voor het lezen van XML. Hier wordt XML verwerkt door activeringsgebeurtenissen gevonden bij het lezen van XML. De geheugenvereisten voor het gebruik van deze methode zijn laag, maar werken met de API is ingewikkelder dan werken met de DOM.
- StAX: De Streaming-API voor XML is een recente toevoeging aan de XML-API's en biedt high-performance streamfiltering, -verwerking en -modificatie van XML. Hoewel het voorkomt dat het hele XML-document in het geheugen wordt geladen, biedt het een pull-type architectuur in plaats van een gebeurtenisgestuurde architectuur, zodat de toepassing eenvoudiger te coderen en te begrijpen is dan de SAX API te gebruiken.
In dit artikel gebruiken we de DOM API om te demonstreren hoe XML-bestanden van Java kunnen worden gelezen en geschreven. We zullen de andere twee API's in toekomstige artikelen behandelen.
Een voorbeeld-XML-bestand
Voor de toepassing van dit artikel demonstreren we de concepten met behulp van de volgende voorbeeld-XML, die u hier kunt vinden:
Gambardella, Matthew XML Developer's Guide Computer 44.95 2000/10/01 Een diepgaande blik op het maken van applicaties met XML. Ralls, Kim ...
Een XML-bestand lezen
Laten we de basisstappen bekijken die nodig zijn voor het lezen van een XML-bestand met behulp van de DOM-API.
De eerste stap is om een exemplaar van te krijgen DocumentBuilder. De builder wordt gebruikt om XML-documenten te ontleden. Voor basisgebruik doen we het als volgt:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder ();
We kunnen nu het hele document in het geheugen laden vanaf het XML-rootelement. In ons voorbeeld is het de catalogus element.
Bestandsbestand = ...; // XML-bestand om te lezen Documentdocument = builder.parse (bestand); Elementcatalogus = document.getDocumentElement ();
En dat is het, mensen! De DOM API voor het lezen van een XML is heel eenvoudig. U hebt nu toegang tot het hele XML-document vanaf het root-element, catalogus. Laten we nu eens kijken hoe we ermee kunnen werken.
De DOM-API gebruiken
Nu hebben we de XML-root Element, we kunnen de DOM API gebruiken om interessante nuggets van informatie te extraheren.
Krijg alle boek kinderen van het wortelelement en loop eroverheen. Let daar op getChildNodes () komt terug allemaal kinderen, inclusief tekst, opmerkingen, enz. Voor ons doel hebben we alleen de onderliggende elementen nodig, dus we slaan de andere over.
NodeList books = catalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++) Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; // work with the book Element here
Hoe vind je een specifiek kindelement, gezien de ouder? De volgende statische methode retourneert het eerste overeenkomende element als dit wordt gevonden, of null. Zoals u kunt zien, omvat de procedure het ophalen van de lijst met onderliggende knooppunten en het doorlopen daarvan, het uitkiezen van elementknooppunten met de opgegeven naam.
static private Node findFirstNamedElement (Node parent, String tagName) NodeList children = parent.getChildNodes (); for (int i = 0, in = children.getLength (); i < in ; i++) Node child = children.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; if ( child.getNodeName().equals(tagName) ) return child; return null;
Houd er rekening mee dat de DOM-API tekstinhoud binnen een element behandelt als een afzonderlijk knooppunt van het type TEXT_NODE. Bovendien kan de tekstinhoud worden gesplitst in meerdere aangrenzende tekstknooppunten. Dus de volgende speciale verwerking is vereist om de tekstinhoud binnen een element op te halen.
static private String getCharacterData (knooppunt bovenliggende) StringBuilder text = new StringBuilder (); if (parent == null) return text.toString (); NodeList children = parent.getChildNodes (); voor (int k = 0, kn = children.getLength (); k < kn ; k++) Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue()); return text.toString();
Gewapend met deze handige functies, laten we nu eens kijken naar een code voor het vermelden van wat informatie uit onze voorbeeld-XML. We willen graag gedetailleerde informatie voor elk boek weergeven, zoals beschikbaar in een boekencatalogus.
NodeList books = catalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++) Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; ii++; String id = book.getAttribute("id"); String author = getCharacterData(findFirstNamedElement(child,"author")); String title = getCharacterData(findFirstNamedElement(child,"title")); String genre = getCharacterData(findFirstNamedElement(child,"genre")); String price = getCharacterData(findFirstNamedElement(child,"price")); String pubdate = getCharacterData(findFirstNamedElement(child,"pubdate")); String descr = getCharacterData(findFirstNamedElement(child,"description")); System.out.printf("%3d. book id = %s\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);
XML-uitvoer schrijven
Java biedt de XML Tranform API om XML-gegevens te transformeren. We gebruiken deze API bij de identiteitstransformatie om output te genereren.
Laten we als voorbeeld een nieuw toevoegen boek element uit de hierboven gepresenteerde voorbeeldcatalogus. De details van het boek (zoals schrijver, titel, enz.) extern kunnen worden verkregen, bijvoorbeeld uit een eigenschappenbestand of een database. We gebruiken het volgende eigenschappenbestand om de gegevens te laden.
id = bk113 auteur = Jane Austen title = Pride and Prejudice genre = Romantiek prijs = 6.99 publish_date = 2010-04-01 description = "Het is een waarheid die universeel wordt erkend, dat een enkele man in het bezit van een fortuin gebrek heeft aan gebrek aan een vrouw." Zo begint Pride and Prejudice, de geestige komedie van manieren van Jane Austen - een van de meest populaire romans aller tijden - met een prachtig geciviliseerde sparring tussen de trotse Mr. Darcy en de bevooroordeelde Elizabeth Bennet terwijl ze hun pittige verkering uitspelen in een reeks van achttiende-eeuwse salon intriges.
De eerste stap is het analyseren van het bestaande XML-bestand met behulp van de hierboven gepresenteerde methode. De code wordt hieronder ook getoond.
Bestandsbestand = ...; // XML-bestand om te lezen Documentdocument = builder.parse (bestand); Elementcatalogus = document.getDocumentElement ();
We laden de gegevens uit het eigenschappenbestand met behulp van de eigenschappen klasse voorzien van java. De code is vrij eenvoudig en hieronder weergegeven.
String propsFile = ...; Eigenschappen rekwisieten = nieuwe eigenschappen (); try (FileReader in = nieuwe FileReader (propsFile)) props.load (in);
Nadat de eigenschappen zijn geladen, halen we de waarden op die we uit het eigenschappenbestand willen toevoegen.
String id = props.getProperty ("id"); String auteur = props.getProperty ("auteur"); String title = props.getProperty ("title"); String genre = props.getProperty ("genre"); String prijs = props.getProperty ("prijs"); String publish_date = props.getProperty ("publicatiedatum"); String descr = props.getProperty ("description");
Laten we nu een lege maken boek element.
Elementboek = document.createElement ("boek"); book.setAttribute ("id", id);
De onderliggende elementen toevoegen aan de boek is triviaal. Voor het gemak verzamelen we de vereiste elementnamen in a Lijst en voeg de waarden in een lus toe.
Lijst elnames = Arrays.asList ("auteur", "titel", "genre", "prijs", "publicatiedatum", "beschrijving"); for (String elname: elnames) Element el = document.createElement (elname); Teksttekst = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendChild (el); catalog.appendChild (boek);
En zo is het gedaan. De catalogus element heeft nu het nieuwe boek element toegevoegd. Het enige dat nu overblijft, is het schrijven van de bijgewerkte XML.
Voor het schrijven van de XML hebben we een instantie nodig van Transformator die is gemaakt zoals hieronder weergegeven. Merk op dat we indentatie van de uitvoer-XML vragen met behulp van de setOutputProperty () methode.
TransformerFactory tfact = TransformerFactory.newInstance (); Transformer tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "yes"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3");
De laatste stap bij het genereren van de XML-uitvoer is het toepassen van de transformatie. Het resultaat verschijnt in de uitvoerstroom, System.out.
tform.transform (nieuwe DOMSource (document), nieuw StreamResult (System.out));
Om de uitvoer rechtstreeks naar een bestand te schrijven, gebruikt u het volgende.
tform.transform (nieuwe DOMSource (document), nieuw StreamResult (nieuw bestand ("output.xml")));
En dat omvat dit artikel over het lezen en schrijven van XML-bestanden met behulp van de DOM API.
Hebt u de DOM-API in uw toepassingen gebruikt? Hoe presteerde het? Laat het ons weten in de comments hieronder.
Ontdek meer over: Java.