文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

【ライブラリ未使用】javaでxmlを整形する【簡単サンプル】

ちょっと苦しいですが標準機能だけで整形できます〜
f:id:treeapps:20180426142529p:plain

tree-tipsで色々な整形サービスを作ろうと思って色々調べているうち、javaの標準機能でxmlを整形するサンプルが出来てしまったので公開します。
xmlファイルから読み込むとテストしにくいので、文字列を引数に渡せるようにしています。

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

public class XmlFormatter {

    public static void main(String[] args) {
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><elm1 attr1=\"attr1\"><elm2 attr2=\"attr2\"><elm3>elm3</elm3><elm4 /></elm2></elm1></root>";
        InputStream in = null;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            in = new ByteArrayInputStream(xmlStr.getBytes());
            Document doc = builder.parse(in);
            Transformer tf = TransformerFactory.newInstance().newTransformer();
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            tf.setOutputProperty(OutputKeys.METHOD, "xml");
            tf.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "4");
            StringWriter sw = new StringWriter();
            tf.transform(new DOMSource(doc), new StreamResult(sw));
            System.out.println(sw.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null)
                    in.close();
            } catch (IOException e) {
            }
        }
    }
}

この結果は以下になります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <elm1 attr1="attr1">
        <elm2 attr2="attr2">
            <elm3>elm3</elm3>
            <elm4/>
        </elm2>
    </elm1>
</root>

インデント数の部分は「indent-amount」の「4」の部分をいじって下さい。

これで実現はできたのですが、1点問題が・・・

standalone="no"がどうしても追加されてしまうのです・・・

つかない方法を探していますが、まだ見つかっていません。。。

AndroidエンジニアのためのモダンJava

AndroidエンジニアのためのモダンJava

はじめてのANDROIDアプリ作成 JAVA入門 (はじめてのAndroidアプリ作成 シリーズ)

はじめてのANDROIDアプリ作成 JAVA入門 (はじめてのAndroidアプリ作成 シリーズ)