Werbung

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

XML-Dateien Was ist eine XML-Datei und wie können Sie sie öffnen und verwenden?Vielleicht haben Sie den Begriff "XML" gesehen. Möglicherweise haben Sie sogar versehentlich eine XML-Datei geöffnet. Was ist XML und wie wird es verwendet? Weiterlesen 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-Standardedition (SE) 10 grundlegende Java-Konzepte, die Sie lernen sollten, wenn Sie beginnenEgal, ob Sie eine GUI schreiben, serverseitige Software oder eine mobile Anwendung mit Android entwickeln, das Erlernen von Java wird Ihnen gute Dienste leisten. Hier sind einige grundlegende Java-Konzepte, die Ihnen den Einstieg erleichtern. Weiterlesen

instagram viewer
beinhaltet die Java-API für die XML-Verarbeitung (JAXP), ein Überbegriff, der die meisten Aspekte der XML-Verarbeitung abdeckt. Diese beinhalten:

  • DOM: Das Document Object Model enthält Klassen zum Arbeiten mit XML-Artefakten wie Element, Knoten, Attributen 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 von 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:

 1.0?>Gambardella, MatthewXML-Entwicklerhandbuch
Rechner44.952000-10-01Ein tiefer Einblick in die Erstellung von Anwendungen mit 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:

DocumentBuilderFactory-Factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (falsch); factory.setValidating (falsch); 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.

Datei Datei =...; // XML-Datei zum Lesen. Dokumentdokument = builder.parse (Datei); Elementkatalog = 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 Wurzelelements und Schleife über sie. Beachten Sie, dass getChildNodes() kehrt zurück alle Kinder, einschließlich Text, Kommentare usw. Für unseren Zweck brauchen wir nur die untergeordneten Elemente, also überspringen wir die anderen.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); ich < n; i++) { Knotenkind = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) weiter; Elementbuch = (Element) Kind; // hier mit dem Buchelement arbeiten. }

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, beinhaltet das Verfahren das Abrufen der Liste der untergeordneten Knoten und das Durchlaufen derselben, um Elementknoten mit dem angegebenen Namen auszuwählen.

statischer privater Knoten findFirstNamedElement (Knoten-Elternteil, String-TagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); ich < in; i++) { Knotenkind = children.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) weiter; if ( child.getNodeName().equals (tagName) ) Rückgabe Kind; } null zurückgeben; }

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 (Knoten-Elternteil) { StringBuilder-Text = neuer StringBuilder(); if ( parent == null ) return text.toString(); NodeList children = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Knotenkind = children.item (k); if ( child.getNodeType() != Node. TEXT_NODE ) Pause; text.append (child.getNodeValue()); } Rückgabetext.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(); ich < n; i++) { Knotenkind = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) weiter; Elementbuch = (Element) Kind; 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. Buch-ID = %s\n" + " Autor: %s\n" + " Titel: %s\n" + " Genre: %s\n" + " Preis: %s\n" + " Veröffentlichungsdatum: %s \n" + " descr: %s\n", 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. Autor=Jane Austen. title=Stolz und Vorurteil. Genre=Romantik. Preis=6,99. Veröffentlichen_Datum=2010-04-01. description="Es ist eine allgemein anerkannte Wahrheit, dass ein alleinstehender Mann, der ein Vermögen besitzt, eine Frau brauchen muss." So beginnt Stolz und Prejudice, Jane Austens witzige Sittenkomödie - einer der beliebtesten Romane aller Zeiten -, in der sich prächtig zivilisiertes Sparring zwischen den beiden zeigt der stolze Mr. Darcy und die voreingenommene Elizabeth Bennet, während sie in einer Reihe von Salons aus dem 18. Intrigen. 

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

Datei Datei =...; // XML-Datei zum Lesen. Dokumentdokument = builder.parse (Datei); Elementkatalog = 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 =...; Eigenschaften props = new Properties(); try (FileReader in = neuer 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("Autor"); String title = props.getProperty("title"); String-Genre = props.getProperty("Genre"); String-Preis = props.getProperty("Preis"); String publish_date = props.getProperty("publish_date"); String descr = props.getProperty("Beschreibung"); 

Lassen Sie uns nun ein leeres erstellen Buchen Element.

Elementbuch = document.createElement("Buch"); 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.

Aufführenelnames =Arrays.asList("Autor", "Titel", "Genre", "Preis", "Veröffentlichungsdatum", "Beschreibung"); for (String elname: elnames) { Element el = document.createElement (elname); Texttext = document.createTextNode (props.getProperty (elname)); el.appendChild (Text); book.appendChild (el); } catalog.appendChild (Buch);

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(); Transformator tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. EINRÜCKEN, "ja"); 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 (neue DOMSource (Dokument), neues StreamResult (System.out)); 

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

tform.transform (neue DOMSource (Dokument), neues StreamResult (neue Datei("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.