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を適用するだけですが、こんなにめんどくさいコードになります。(笑)