| home | suche | kontakt/johner | institut | hinweise studierende | tech-docs | blog | mindmailer |
![]() |
XML-Verarbeitung mit JaxP
Inzwischen bietet Java mit Bordmitteln eine elegante Art, XML-Dokumente zu erzeugen und zu bearbeiten. Auch die Serialisierung und Deserialisierung ist mit wenigen Zeilen Programmcode zu erreichen. Beachten Sie in diesem Kontext auch JaxB.
package xmlJaxP;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class StartJaxP {
private static String text = "<HTWG><student id=\"2\">Carla</student><student id=\"3\">Carl</student></HTWG>";
public static void main(String[] args) {
try {
//1. Generate XML from String or from File
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(new InputSource(new StringReader(text)));
//oder aus Datei: Document dom = db.parse("employees.xml");
//2. Get Elements
Element root = dom.getDocumentElement();
NodeList students = root.getElementsByTagName("student");
if(students != null && students.getLength() > 0) {
for(int i = 0 ; i < students.getLength();i++) {
Element student = (Element)students.item(i);
String id = student.getAttribute("id");
String name = student.getTextContent(); //alternativ: student.getFirstChild().getNodeValue();
System.out.println("Der Student heißt " + name + " und hat die id " + id);
}
}
//3. XML from scratch
Document newDoc = db.newDocument();
Element newRoot = newDoc.createElement("Bibliothek");
newDoc.appendChild(newRoot);
Element firstBook = newDoc.createElement("Buch");
firstBook.setAttribute("isbn", "123-4");
Text sparbuch = newDoc.createTextNode("Sparbuch");
firstBook.appendChild(sparbuch);
newRoot.appendChild(firstBook);
Element secondBook = newDoc.createElement("Buch");
secondBook.setAttribute("isbn", "456-7");
Text herrDerRinge = newDoc.createTextNode("Herr der Ringe");
secondBook.appendChild(herrDerRinge);
newRoot.appendChild(secondBook);
//4. print or create file
OutputFormat format = new OutputFormat(dom);
format.setIndenting(true);
XMLSerializer serializerSysOut = new XMLSerializer(System.out, format);
serializerSysOut.serialize(newDoc);
FileOutputStream output = new FileOutputStream(new File("Buecheer.xml"));
XMLSerializer serializer = new XMLSerializer(output, format);
serializer.serialize(newDoc);
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (SAXException se) {
se.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
XML-Verarbeitung mit DOM4J
Die Bibliothek Dom4J (www.dom4j.org) bietet sich für das Verarbeiten von XML-Dokumenten an. Es erlaubt es Dokumente programmatisch zu erstellen, auszugeben und zu durchsuchen. Mit dem DocumentHelper können auch String, welche einem XML-Dokument entsprechen, in Instanzen der Klasse Document zu überführen.
package xmlParsingDom4J;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultAttribute;
public class StartDom4J {
public static void main(String[] args) throws Exception{
StartDom4J start = new StartDom4J();
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
Element author1 = root.addElement("author");
author1.addAttribute("name", "James");
author1.addAttribute("location", "UK");
author1.addText("James Strachan");
Element author2 = root.addElement("author");
author2.addAttribute("name", "Bob");
author2.addAttribute("location", "US");
author2.addText("Bob McWhirter");
//als Text ausgeben
String text = document.asXML();
System.out.println("Dokument: " + text);
//durch iteratieren
start.treeWalk(document.getRootElement());
//suchen mit XPath
start.suchenMitXPath(document, "//author[text()='James Strachan']");
start.suchenMitXPath(document, "//author[@location='US']");
//in Datei ausgeben
start.write(document, "./output.xml");
//Neues Dokument erzeugen, indem Text geparst wird
document = DocumentHelper.parseText("<HTWG><student id=\"2\">Carla</student><student id=\"3\">Carl</student></HTWG>");
start.write(document, "output2.xml");
}
public void write(Document document, String path) throws IOException {
// In Datei schreiben (alternativ zu new FileWriter einfach System.out)
// Format kann weggelassen oder durch createCompactFormat ersetzt werden
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(path), format);
writer.write(document);
writer.close(); //bei System.out nicht notwendig
}
/**
* Über Dokument iterieren (rekursiv)
* @param element
*/
public void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
treeWalk( (Element) node );
System.out.println("Element heißt: " + node.getName() +
" mit Wert " + node.getStringValue() +
" und mit Attributen");
List<DefaultAttribute> attributes = ((Element)node).attributes();
for(DefaultAttribute attribute : attributes) {
System.out.println(attribute.getName() + " und Wert " + attribute.getValue());
}
} else {
System.out.println("Anderer Node "+ node);
}
}
}
/**
* Mit XPath suchen
* @param document
* @param xpath
*/
public void suchenMitXPath(Document document, String xpath){
List<Node> nodes = document.selectNodes( xpath );
System.out.println("Anzahl gefunden: " + nodes.size());
for (Node node : nodes) {
System.out.println("Node gefunden: " + node.getName() + " mit Wert " + node.getStringValue());
}
}
}
