JavaでXMLをフォーマットする

とある仕事で、XMLにインデントをつけてを整形する必要があった。
多分、書き出す時にでもオプションがあるんだろう・・とタカをくくっていたが、それは大間違いであった(笑)

いろいろ調べてみて、一番手っ取り早い方法は、XSLTを使えと、そういう事らしい。

まずは、こんなXSLを作る。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xalan="http://xml.apache.org/xslt">
	<xsl:output method="xml" encoding="UTF-8"
		indent="yes" xalan:indent-amount="2"/>
	<xsl:template match="/">
		<xsl:copy-of select="."/>
	</xsl:template>
</xsl:stylesheet>


xmlns:xalanとかあって、何となく気持ち悪いけど、気にしない(笑)
あとは、これをXMLに適用するだけ。簡単です。
ちなみに、OSX 10.4 で、java version "1.5.0_06"です。J2SE1.4でもOKだと思いますし、J2SE1.3でもXMLパーサが入っていればOKだと思います。(いい加減ですんません。)

public static void main(String[] args) throws Exception {
	// フォーマットしたいXML
	File targetXml = new File("target.xml");
	// インデントをつけるスタイルシート
	File xsl = new File("style.xsl");
	// フォーマットしたXML
	File outXml = new File("out.xml");

	// フォーマットしたいXMLのDOMオブジェクトを作る
	DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
	DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
	Document doc = docBuilder.parse(new FileInputStream(targetXml));

	// Transformerを用意する。
	StreamSource xslSource = new StreamSource(xsl);
	TransformerFactory transFactory = TransformerFactory.newInstance();
	Transformer transformer = transFactory.newTransformer(xslSource);

	//XSLを適用してoutXmlに書き出す。
	DOMSource source = new DOMSource(doc);
	Result result = new StreamResult(new FileOutputStream(outXml));
	transformer.transform(source, result);
}

XSLを適用するだけですが、こんなにめんどくさいコードになります。(笑)