So lesen und schreiben Sie XML-Dateien mit Code

So lesen und schreiben Sie XML-Dateien mit Code / Programmierung

Möchten Sie lernen, wie Sie eine XML-Datei aus Java lesen und schreiben können??

XML-Dateien werden für verschiedene Zwecke verwendet, einschließlich der Speicherung von Daten. Bevor JSON populär wurde, war XML das bevorzugte Format für die Darstellung, Speicherung und den Transport strukturierter Daten. Auch wenn die Beliebtheit von XML in den letzten Jahren nachgelassen hat, kann es gelegentlich vorkommen, dass es wichtig ist, aus dem Code heraus zu lernen, wie man damit arbeitet.

Java Standard Edition (SE) 10 Grundlegende Java-Konzepte, die Sie beim Einstieg erlernen sollten 10 Grundlegende Java-Konzepte, die Sie beim Einstieg erlernen sollten Ob Sie eine grafische Benutzeroberfläche schreiben, serverseitige Software entwickeln oder eine mobile Anwendung mit Android, Java-Lernen ist für Sie da dir gut Hier sind einige grundlegende Java-Konzepte, die Ihnen den Einstieg erleichtern. Mehr lesen beinhaltet die Java API für XML-Verarbeitung (JAXP), Dies ist ein Oberbegriff, der die meisten Aspekte der XML-Verarbeitung abdeckt. Diese schließen ein:

  • DOM: Das Document Object Model enthält Klassen für das Arbeiten mit XML-Artefakten wie Element, Knoten, Attribute usw. Die DOM-API lädt das vollständige XML-Dokument zur Verarbeitung in den Speicher, sodass es sich nicht besonders für das Arbeiten mit großen XML-Dateien eignet.
  • SAXOPHON: Die Simple API für XML ist ein ereignisgesteuerter Algorithmus zum Lesen von XML. Hier wird XML durch Auslöseereignisse verarbeitet, die beim Lesen von XML gefunden wurden. Der Speicherbedarf für die Verwendung dieser Methode ist gering, aber das Arbeiten mit der API ist komplexer als das Arbeiten mit dem DOM.
  • StAX: Die Streaming-API für XML ist eine kürzlich hinzugefügte Ergänzung der XML-APIs und ermöglicht die Hochleistungsfilterung, -verarbeitung und -änderung von XML. Das gesamte XML-Dokument wird nicht in den Arbeitsspeicher geladen, es wird jedoch eine ereignisgesteuerte Architektur vom Pull-Typ bereitgestellt, sodass die Anwendung einfacher zu codieren und zu verstehen ist als die Verwendung der SAX-API.

In diesem Artikel verwenden wir die DOM-API um zu zeigen, 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 den Zweck dieses Artikels demonstrieren wir die Konzepte anhand des folgenden XML-Beispiels, das hier zu finden ist:

   Gambardella, Matthew XML-Entwicklerhandbuch Computer 44,95 2000-10-01 Ein tieferer Einblick in das Erstellen von Anwendungen mit XML.   Ralls, Kim

XML-Datei lesen

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

Der erste Schritt ist, eine Instanz von zu erhalten DocumentBuilder. Der Builder wird zum Analysieren von XML-Dokumenten verwendet. Für die grundlegende Verwendung machen wir es so:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder-Builder = factory.newDocumentBuilder (); 

Wir können jetzt das gesamte Dokument aus dem XML-Stammelement in den Speicher laden. In unserem Beispiel ist es das Katalog Element.

Datei datei =…; // XML-Datei zum Lesen Document document = builder.parse (file); Elementkatalog = document.getDocumentElement (); 

Und das ist es, Leute! Die DOM-API zum Lesen von XML ist sehr einfach. Sie haben nun vom Stammelement aus Zugriff auf das gesamte XML-Dokument, Katalog. Lassen Sie uns jetzt sehen, wie wir damit arbeiten.

Verwenden der DOM-API

Nun haben wir die XML-Wurzel Element, Wir können die DOM-API verwenden, um interessante Nuggets von Informationen zu extrahieren.

Holen Sie sich alle Buch Kinder des Wurzelelements und überlaufen sie. Beachten Sie, dass getChildNodes () kehrt zurück alles Kinder, einschließlich Text, Kommentare usw. Für unsere Zwecke benötigen wir nur die Kindelemente, so dass wir die anderen überspringen.

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  

Wie finden Sie ein bestimmtes untergeordnetes Element, wenn Sie das übergeordnete Element verwenden? Die folgende statische Methode gibt das erste übereinstimmende Element oder den Wert null zurück. Wie Sie sehen, umfasst die Prozedur das Abrufen der Liste der untergeordneten Knoten und das Durchlaufen dieser Knoten, wobei Elementknoten mit dem angegebenen Namen ausgewählt werden.

statischer privater Knoten 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;  

Beachten Sie, dass die DOM-API Textinhalt 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.

statischer privater String getCharacterData (übergeordneter Knoten) StringBuilder text = new StringBuilder (); if (parent == null) gibt text.toString () zurück; NodeList children = parent.getChildNodes (); for (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();  

Mit diesen Komfortfunktionen können wir uns nun einen Code ansehen, der einige Informationen aus unserem Beispiel-XML auflistet. Wir möchten detaillierte Informationen zu jedem Buch anzeigen, wie sie beispielsweise in einem Buchkatalog verfügbar wären.

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

Java bietet die XML-Tranform-API XML-Daten umwandeln. Wir verwenden diese API mit der Identität transformieren Ausgabe erzeugen.

Lassen Sie uns als Beispiel ein neues hinzufügen Buch Element in den oben dargestellten Beispielkatalog. Die Details des Buches (wie z Autor, Titel, etc) kann extern abgerufen werden, z. B. aus einer Eigenschaftsdatei oder einer Datenbank. Wir verwenden die folgende Eigenschaftendatei, um die Daten zu laden.

id = bk113 author = Jane Austen title = Genre Stolz und Vorurteil = Romanze Preis = 6,99 publish_date = 2010-04-01 description = "Es ist eine allgemein anerkannte Wahrheit, dass ein einzelner Mann, der über ein gutes Vermögen verfügt, mangelhaft sein muss eine Ehefrau." So beginnt Stolz und Vorurteil, Jane Austens witzige Komödie der Manieren - eine der populärsten Romanen aller Zeiten -, in der sich herrlich zivilisierte Sparrings zwischen dem stolzen Mr. Darcy und der voreingenommenen Elizabeth Bennet präsentieren, während sie ihre temperamentvolle Werbung in einer Reihe von Spielen durchführen Intrigen des Salonzimmers aus dem 18. Jahrhundert. 

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

Datei datei =…; // XML-Datei zum Lesen Document document = builder.parse (file); Elementkatalog = document.getDocumentElement (); 

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

String propsFile =…; Eigenschaften Requisiten = neue Eigenschaften (); try (FileReader in = neuer FileReader (propsFile)) props.load (in);  

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

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

Lassen Sie uns jetzt eine Leere erstellen Buch Element.

Element book = document.createElement ("book"); book.setAttribute ("id", id); 

Hinzufügen der untergeordneten Elemente zum Buch ist trivial. Der Einfachheit halber sammeln wir die erforderlichen Elementnamen in a Liste und addieren Sie die Werte in einer Schleife.

Liste 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 (Buch); 

Und so wird es gemacht. Das Katalog Element hat jetzt das Neue Buch Element hinzugefügt. Jetzt bleibt nur noch das aktualisierte XML herauszuschreiben.

Um XML schreiben zu können, benötigen wir eine Instanz von Transformator welche wie unten gezeigt erstellt wird. Beachten Sie, dass wir den Einzug der Ausgabe-XML mit der Option setOutputProperty () Methode.

TransformerFactory tfact = TransformerFactory.newInstance (); Transformer tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "yes"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

Der letzte Schritt beim Generieren der XML-Ausgabe ist das Anwenden der Transformation. Das Ergebnis wird im Ausgabestrom angezeigt, 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"))); 

Und damit ist dieser Artikel zum Lesen und Schreiben von XML-Dateien mithilfe der DOM-API abgeschlossen.

Haben Sie die DOM-API in Ihren Anwendungen verwendet? Wie hat es gespielt? Bitte teilen Sie uns in den Kommentaren unten mit.

Erfahren Sie mehr über: Java.