XML Pretty Print

Ich habe mir mal einen kleinen XML Beautifier geschrieben. Es gibt zwar andere Möglichkeiten, zum Beispiel via JAXB oder Ähnlichem, aber diese Beautifier nehmen alle keine String an und geben ihn dann nur formatiert zurück, man müsste immer den Umweg über Marshal/Unmarshal gehen oder Ähnliches. Die untenstehende Methode String prettyPrint(String xml) nutzt dem DOM Parser um den XML String zu parsen und dann wieder schön formatiert auszugeben. Wer einen einfacheren, schnelleren Weg kennt, soll sich bitte melden ;).

Hinweis: In Java 1.5 gibt es anscheinend einen Bug in der Transformer Klasse. Daher wird diese hier nicht verwendet! Ein Workaround wird hier beschrieben.

Im besten Fall wird der formatierte String zurückgegeben, im schlechtesten Fall (bei Exceptions) der unformatierte Original-String.

import java.io.BufferedWriter;
import java.io.StringWriter;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
 
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
 
public class XMLUtils {
 
	private XMLUtils() {
	}
 
	private static final String ISO_8859_1 = "ISO-8859-1";
 
	/**
	 * Diese Methode formatiert einen gegebenen XML String mit Einrückungen und
	 * Umbrüchen. Es wird explizit nicht die Axis Klasse XMLUtils genutzt, hier
	 * gibt es Probleme mit dem korrekten Encoding des XMLs. Der Transformer
	 * scheidet leider auch aus, er ist in Java 1.5 nicht korrekt implementiert,
	 * vgl.: http://forums.sun.com/thread.jspa?threadID=562510&start=0&tstart=0
	 * Daher hier eine handgestrickte Methode.
	 * 
	 * @param xml
	 *            als String
	 * @return Einen formatierten String mit Einrückungen etc.
	 */
	public static String prettyPrint(String xml) {
		StringWriter strWr = new StringWriter();
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = factory.newDocumentBuilder();
			InputSource inStream = new InputSource();
			inStream.setCharacterStream(new java.io.StringReader(xml));
			inStream.setEncoding(ISO_8859_1);
			Document doc = db.parse(inStream);
			OutputFormat format = new OutputFormat();
			format.setIndenting(true);
			format.setIndent(3);
			format.setEncoding(ISO_8859_1);
			BufferedWriter out = new BufferedWriter(strWr);
			XMLSerializer serializer = new XMLSerializer(out, format);
			serializer.serialize(doc);
			System.out.println();
		} catch (Exception e) {
			// Error-Handling
			return xml;
		}
		return strWr.toString();
	}
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.