So lesen und schreiben Sie XML-Dateien mit Code

So lesen und schreiben Sie XML-Dateien mit Code

Möchten Sie lernen, wie man eine XML-Datei aus Java liest und schreibt?





XML-Dateien werden für eine Vielzahl von Zwecken verwendet, einschließlich der Speicherung von Daten. Bevor JSON populär wurde, war XML das bevorzugte Format zum Darstellen, Speichern und Transportieren strukturierter Daten. Obwohl die Popularität von XML in den letzten Jahren abgenommen hat, kann es gelegentlich vorkommen, dass Sie damit konfrontiert werden.





Java Standard Edition (SE) enthält die Java-API für die XML-Verarbeitung (JAXP) , ein Überbegriff, der die meisten Aspekte der XML-Verarbeitung abdeckt. Diese beinhalten:





  • BEURTEILUNG: Das Document Object Model enthält Klassen für die Arbeit mit XML-Artefakten wie Element, Node, Attribute usw. Die DOM-API lädt das komplette XML-Dokument zur Verarbeitung in den Speicher und ist daher für die Arbeit mit großen XML-Dateien nicht sehr geeignet.
  • SAXOPHON: Die Simple API for XML ist ein ereignisgesteuerter Algorithmus zum Lesen von XML. Hier wird XML verarbeitet, indem Ereignisse ausgelöst werden, die beim Lesen von XML gefunden werden. Der Speicherbedarf für die Verwendung dieser Methode ist gering, aber die Arbeit mit der API ist komplexer als die Arbeit mit dem DOM.
  • StAX: Die Streaming-API für XML ist eine neuere Ergänzung der XML-APIs und bietet leistungsstarke Stream-Filterung, -Verarbeitung und -Änderung von XML. Es vermeidet zwar das Laden des gesamten XML-Dokuments in den Speicher, bietet jedoch eher eine Pull-Typ-Architektur als eine ereignisgesteuerte Architektur, sodass die Anwendung einfacher zu programmieren und zu verstehen ist als die Verwendung der SAX-API.

In diesem Artikel verwenden wir die DOM-API um zu demonstrieren, wie man XML-Dateien aus Java liest und schreibt. Wir werden die anderen beiden APIs in zukünftigen Artikeln behandeln.

Eine XML-Beispieldatei

Für die Zwecke dieses Artikels demonstrieren wir die Konzepte anhand der folgenden Beispiel-XML, die gefunden werden kann Hier :






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


Ralls, Kim
...

Lesen einer XML-Datei

Sehen wir uns die grundlegenden Schritte an, die zum Lesen einer XML-Datei mit der DOM-API erforderlich sind.

Der erste Schritt besteht darin, eine Instanz von . zu erhalten DocumentBuilder . Der Builder wird zum Parsen von XML-Dokumenten verwendet. Für den grundlegenden Gebrauch machen wir es wie folgt:





So löschen Sie eine zweite Seite in Word
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Wir können nun das gesamte Dokument ausgehend vom XML-Root-Element in den Speicher laden. In unserem Beispiel ist es der Katalog Element.

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

Und das war's, Leute! Die DOM-API zum Lesen einer XML ist wirklich einfach. Sie haben nun Zugriff auf das gesamte XML-Dokument, beginnend mit seinem Wurzelelement, Katalog . Sehen wir uns nun an, wie man damit arbeitet.





Verwenden der DOM-API

Jetzt haben wir das XML-Root Element , können wir die DOM-API verwenden, um interessante Informationsnuggets zu extrahieren.

Holen Sie sich alle Buchen Kinder des Root-Elements und Schleife über sie. Beachten Sie, dass getChildNodes() kehrt zurück alle Kinder, einschließlich Text, Kommentare usw. Für unseren Zweck benötigen wir nur die untergeordneten Elemente, daher überspringen wir die anderen.

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
}

Wie finden Sie ein bestimmtes untergeordnetes Element angesichts des übergeordneten Elements? Die folgende statische Methode gibt das erste übereinstimmende Element zurück, wenn es gefunden wird, oder null. Wie Sie sehen können, umfasst das Verfahren das Abrufen der Liste der untergeordneten Knoten und das Durchlaufen dieser Elemente, wobei Elementknoten mit dem angegebenen Namen ausgewählt werden.

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;
}

Beachten Sie, dass die DOM-API Textinhalte innerhalb eines Elements als separaten Knoten des Typs behandelt TEXT_NODE . Außerdem kann der Textinhalt in mehrere benachbarte Textknoten aufgeteilt werden. Daher ist die folgende spezielle Verarbeitung erforderlich, um den Textinhalt innerhalb eines Elements abzurufen.

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();
}

Ausgestattet mit diesen praktischen Funktionen sehen wir uns nun Code an, um einige Informationen aus unserem Beispiel-XML aufzulisten. Wir möchten zu jedem Buch detaillierte Informationen anzeigen, wie sie in einem Buchkatalog verfügbar wären.

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-Ausgabe schreiben

Java bietet die XML-Transformations-API um XML-Daten zu transformieren. Wir verwenden diese API mit dem Identitätstransformation Ausgabe zu generieren.

Lassen Sie uns als Beispiel ein neues hinzufügen Buchen Element zum oben vorgestellten Musterkatalog. Die Details des Buches (wie z Autor , Titel , etc) können extern abgerufen werden, vielleicht aus einer Eigenschaftendatei oder einer Datenbank. Wir verwenden die folgende Eigenschaftendatei, um die Daten zu 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.

Der erste Schritt besteht darin, die vorhandene XML-Datei mit der oben vorgestellten Methode zu parsen. Der Code wird auch unten angezeigt.

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

Wir laden die Daten aus der Eigenschaftendatei mit dem Eigenschaften Klasse mit Java versehen. Der Code ist ganz einfach und unten gezeigt.

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

Sobald die Eigenschaften geladen sind, rufen wir die Werte, die wir hinzufügen möchten, aus der Eigenschaftendatei ab.

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');

Lassen Sie uns nun ein leeres erstellen Buchen Element.

Amazon nach Anzahl der Bewertungen sortieren
Element book = document.createElement('book');
book.setAttribute('id', id);

Hinzufügen der untergeordneten Elemente zum Buchen ist trivial. Der Einfachheit halber sammeln wir die erforderlichen Elementnamen in a Aufführen und addiere die Werte in einer Schleife.

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);

Und so wird es gemacht. Die Katalog Element hat jetzt das neue Buchen Element hinzugefügt. Jetzt müssen Sie nur noch das aktualisierte XML schreiben.

Zum Schreiben des XML benötigen wir eine Instanz von Transformator die wie unten gezeigt erstellt wird. Beachten Sie, dass wir die Einrückung der Ausgabe-XML mit dem anfordern 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');

Der letzte Schritt beim Generieren der XML-Ausgabe besteht darin, die Transformation anzuwenden. Das Ergebnis erscheint im Ausgabestream, System.out .

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

Um die Ausgabe direkt in eine Datei zu schreiben, verwenden Sie Folgendes.

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

Damit ist dieser Artikel zum Lesen und Schreiben von XML-Dateien mit der DOM-API abgeschlossen.

Haben Sie die DOM-API in Ihren Anwendungen verwendet? Wie hat es funktioniert? Bitte lass es uns in den Kommentaren unten wissen.

Teilen Teilen Tweet Email Canon vs. Nikon: Welche Kameramarke ist besser?

Canon und Nikon sind die beiden größten Namen in der Kamerabranche. Aber welche Marke bietet die bessere Auswahl an Kameras und Objektiven?

Weiter lesen
Verwandte Themen
  • Programmierung
  • Java
Über den Autor Jay Sridhar(17 Artikel veröffentlicht) Mehr von Jay Sridhar

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um zu abonnieren