XML-bestanden lezen en schrijven met code

XML-bestanden lezen en schrijven met code

Wilt u leren hoe u een XML-bestand uit java kunt lezen en schrijven?





XML-bestanden worden gebruikt voor verschillende doeleinden, waaronder opslag van gegevens. Voordat JSON populair werd, was XML het voorkeursformaat voor het weergeven, opslaan en transporteren van gestructureerde gegevens. Hoewel de populariteit van XML de afgelopen jaren is afgenomen, kun je het af en toe tegenkomen, dus het is belangrijk om ermee te leren werken vanuit code.





Java Standard Edition (SE) bevat de Java API voor XML-verwerking (JAXP) , een overkoepelende term die de meeste aspecten van XML-verwerking omvat. Waaronder:





  • OORDEEL: Het Document Object Model bevat klassen voor het werken met XML-artefacten zoals element, node, attributen, enz. 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 Simple API for XML is een gebeurtenisgestuurd algoritme voor het lezen van XML. Hier wordt XML verwerkt door gebeurtenissen te activeren die zijn gevonden bij het lezen van XML. De geheugenvereisten voor het gebruik van deze methode zijn laag, maar het werken met de API is complexer dan het werken met de DOM.
  • STAX: De Streaming-API voor XML is een recente toevoeging aan de XML-API's en biedt hoogwaardige stroomfiltering, verwerking en wijziging 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 gemakkelijker te coderen en te begrijpen is dan het gebruik van de SAX API.

In dit artikel gebruiken we de DOM-API om te demonstreren hoe u XML-bestanden uit java kunt lezen en schrijven. 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 kan worden gevonden: hier :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Een XML-bestand lezen

Laten we eens kijken naar de basisstappen die nodig zijn voor het lezen van een XML-bestand met behulp van de DOM API.

De eerste stap is het verkrijgen van een exemplaar van DocumentBuilder . De builder wordt gebruikt om XML-documenten te ontleden. Voor basisgebruik doen we het als volgt:





hoe weet je of iemand je blokkeert op snapchat
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.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = 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 kijken hoe we ermee kunnen werken.





De DOM-API gebruiken

Nu we de XML-root hebben Element , kunnen we de DOM API gebruiken om interessante klompjes informatie te extraheren.

Krijg alle boek kinderen van het wortelelement en loop eroverheen. Let daar op getChildNodes() geeft terug alle 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 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, gegeven de ouder? De volgende statische methode retourneert het eerste overeenkomende element indien gevonden, of null. Zoals u kunt zien, houdt de procedure in dat u de lijst met onderliggende knooppunten ophaalt en deze doorloopt om elementknooppunten met de opgegeven naam uit te kiezen.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; 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 als een afzonderlijk type knooppunt behandelt TEXT_NODE . Bovendien kan de tekstinhoud worden opgesplitst in meerdere aangrenzende tekstknooppunten. Dus de volgende speciale verwerking is vereist om de tekstinhoud binnen een element op te halen.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Laten we, gewapend met deze gemaksfuncties, nu eens kijken naar wat code om wat informatie uit onze voorbeeld-XML op te sommen. We willen graag gedetailleerde informatie voor elk boek tonen, zoals beschikbaar zou zijn in een boekencatalogus.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; 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
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

XML-uitvoer schrijven

Java biedt de XML Transform-API om XML-gegevens te transformeren. We gebruiken deze API met de identiteitstransformatie output te genereren.

Laten we als voorbeeld een nieuwe . toevoegen boek element toe aan de hierboven gepresenteerde voorbeeldcatalogus. De details van het boek (zoals: auteur , titel , enz.) kunnen extern worden verkregen, bijvoorbeeld uit een eigenschappenbestand of een database. We gebruiken het volgende eigenschappenbestand om de gegevens te laden.

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

De eerste stap is het ontleden van het bestaande XML-bestand met behulp van de hierboven gepresenteerde methode. De code is ook hieronder weergegeven.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

We laden de gegevens uit het eigenschappenbestand met behulp van de Eigendommen klasse voorzien van java. De code is vrij eenvoudig en wordt hieronder weergegeven.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

Zodra de eigenschappen zijn geladen, halen we de waarden op die we willen toevoegen uit het eigenschappenbestand.

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Laten we nu een lege . maken boek element.

dingen die je kunt doen met frambozenpi
Element book = document.createElement('book');
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.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

En zo wordt het gedaan. De catalogus element heeft nu de nieuwe boek element toegevoegd. Het enige dat nu nog rest, is het uitschrijven van de bijgewerkte XML.

Voor het schrijven van de XML hebben we een instantie nodig van Transformator die is gemaakt zoals hieronder wordt weergegeven. Merk op dat we inspringing 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/xslt}indent-amount', '3');

De laatste stap bij het genereren van de XML-uitvoer is het toepassen van de transformatie. Het resultaat verschijnt op de uitvoerstroom, Systeem.uit .

tform.transform(new DOMSource(document), new StreamResult(System.out));

Gebruik het volgende om de uitvoer rechtstreeks naar een bestand te schrijven.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

En daarmee is dit artikel over het lezen en schrijven van XML-bestanden met de DOM API afgerond.

Heb je de DOM API gebruikt in je applicaties? Hoe presteerde het? Laat het ons weten in de reacties hieronder.

Deel Deel Tweeten E-mail Canon versus Nikon: welk cameramerk is beter?

Canon en Nikon zijn de twee grootste namen in de camera-industrie. Maar welk merk biedt de betere reeks camera's en lenzen?

Lees volgende
Gerelateerde onderwerpen
  • Programmeren
  • Java
Over de auteur Jay Sridhar(17 artikelen gepubliceerd) Meer van Jay Sridhar

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren