Im letzten Abschnitt wollen wir XML-Daten in einem eigenen Baum einfügen und diesen XML-Baum in eine Textdatei schreiben. Diese Datei soll die Struktur einer wohlgeformten XML-Datei haben. Dazu verwenden wir die Programmstruktur aus dem vorangegangenen Beispiel und geben die gefundenen Attribut- und Elementwerte in eine Textdatei aus.
import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class XML5 { public void parsen(String [] args) throws Exception { DocumentBuilderFactory fabrik = DocumentBuilderFactory.newInstance(); DocumentBuilder aufbau = fabrik.newDocumentBuilder(); Document eingabebaum = aufbau.parse(args[0]); FileWriter ausgabeStrom = new FileWriter(args[1]); BufferedWriter ausgabe = new BufferedWriter(ausgabeStrom); Document ausgabebaum = aufbau.newDocument(); Element wurzel = ausgabebaum.createElement("Wahlpflichtfach"); ausgabebaum.appendChild(wurzel); ausgabe.write("<?xml version='1.0'?>\n"); ausgabe.write("<Wahlpflichtfach>\n"); NodeList knotenListe = eingabebaum.getElementsByTagName("skriptum"); int anzahl = knotenListe.getLength(); for (int i=0; i<anzahl; i++) { Element element = (Element) knotenListe.item(i); String attributwert = element.getAttribute("titel"); ausgabe.write("\t<kurs titel='" + attributwert + "'>\n"); Element kindElement = (Element) knotenListe.item(i); NodeList kindKnoten = kindElement.getElementsByTagName("kapitel"); int anzahl2 = kindKnoten.getLength(); for (int j=0; j<anzahl2; j++) { String elementwert = kindKnoten.item(j).getFirstChild().getNodeValue(); ausgabe.write("\t\t<kapitel>" + elementwert + "</kapitel>\n"); } ausgabe.write("\t</kurs>\n"); } ausgabe.write("</Wahlpflichtfach>"); ausgabe.close(); } public static void main (String [] args) throws Exception { XML5 proggi = new XML5(); proggi.parsen(args); } }
Unter der Voraussetzung, dass die Schreirechte für das aktuelle Verzeichnis bestehen, können wir die neue XML-Datei erzeugen:
alfred@duron:~/java/xml> java XML5 test.xml neu.xml
Wir öffnen die neue XML-Datei:
<?xml version='1.0'?> <Wahlpflichtfach> <kurs titel='Java'> <kapitel>Einfuehrung</kapitel> <kapitel>XML</kapitel> <kapitel>DTD</kapitel> <kapitel>XSL</kapitel> </kurs> <kurs titel='PHP'> <kapitel>Einfuehrung</kapitel> <kapitel>Apache</kapitel> <kapitel>Server - Client</kapitel> <kapitel>Grundlagen</kapitel> <kapitel>Formulare</kapitel> <kapitel>PDF</kapitel> <kapitel>Grafiken</kapitel> </kurs> </Wahlpflichtfach>
Diese Datei kann nicht auf Gültigkeit überprüft werden, weil keine DTD angegeben wurde. Allerdings kann sie mit Hilfe eines SAX-Parsers geparst werden:
alfred@duron:~/java/xml> java XML1 neu.xml Die Datei neu.xml wurde erfolgreich geparst 14 Elemente gefunden
Damit ist überprüft worden, ob die Datei neu.xml wohlgeformt ist. Löschen wir mutwillig das Endetag </kurs> heraus, so erhalten wir die entsprechende Fehlermeldung des SAX-Parsers:
alfred@duron:~/java/xml> java XML1 neu.xml [Fatal Error] neu.xml:17:3: Der Elementtyp "kurs" muss mit dem entsprechenden Endbefehl "</kurs>" beendet werden. Exception in thread "main" org.xml.sax.SAXParseException: Der Elementtyp "kurs" muss mit dem entsprechenden Endbefehl "</kurs>" beendet werden. at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at XML1.parsen(XML1.java:17) at XML1.main(XML1.java:32)