Java Tips – DOM – XMLドキュメントをファイルに出力する際のインデントを設定するには


DOM(Document Object Model)を使用して、XMLドキュメントをファイルに出力する際のインデントを設定する手順は以下の通りです。

  1. TransformerクラスのsetOutputPropertyメソッドで、OutputKeys.INDENTOutputPropertiesFactory.S_KEY_INDENT_AMOUNTを指定します。

package net.tk_factory.example.xml.dom;

import java.io.File;

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

import org.apache.log4j.Logger;
import org.apache.xml.serializer.OutputPropertiesFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import net.tk_factory.example.AbstractExample;

/**
 * DOM(Document Object Model)を使用したサンプルプログラムです。<br/>
 * <br/>
 * <b>内容</b>
 * <ol type="1">
 * <li>XMLドキュメントのインデントを設定します。</li>
 * </ol>
 *
 * @author Takafumi Kondo (TK Factory)
 */
public class ExampleSetIndent extends AbstractExample
{
    /** クラス名 */
    private static final String CLASS_NAME =
            ExampleSetIndent.class.getSimpleName();

    /** ロガー */
    private static final Logger LOGGER =
            Logger.getLogger(ExampleSetIndent.class.getName());

    /** 出力ファイル名 */
    private static final String OUT_FILE_NAME =
            EXAMPLE_FILE_DIRECTORY +  CLASS_NAME + ".xml";

    /**
     * ExampleSetIndentオブジェクトを構築すると、
     * UnsupportedOperationExceptionがスローされます。<br/>
     */
    protected ExampleSetIndent()
    {
        throw new UnsupportedOperationException();
    }

    /**
     * mainメソッドです。<br/>
     *
     * @param args 引数
     */
    public static void main(String[] args)
    {
        LOGGER.info("[START]" + CLASS_NAME);

        try
        {
            //XMLドキュメントを作成する
            DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
            Document document = docbuilder.newDocument();

            //ルート要素を作成する
            Element root = document.createElement("root");
            document.appendChild(root);

            //ルート要素に子要素1を追加する
            Element child1 = document.createElement("child1");
            root.appendChild(child1);

            //ルート要素に子要素2を追加する
            Element child2 = document.createElement("child2");
            root.appendChild(child2);

            //XMLドキュメントをファイルに出力する
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer transformer = tfactory.newTransformer();

            //XMLドキュメントのインデントを指定する
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");

            File file = new File(OUT_FILE_NAME);
            transformer.transform(new DOMSource(document), new StreamResult(file));
        }
        catch (ParserConfigurationException ex)
        {
            //DocumentBuilderオブジェクトの作成に失敗した場合
            LOGGER.error(getStackTrace(ex));
        }
        catch (TransformerConfigurationException ex)
        {
            //Transformerオブジェクトの作成に失敗した場合
            LOGGER.error(getStackTrace(ex));
        }
        catch (TransformerException ex)
        {
            //XMLドキュメントをファイルに出力する際にエラーが発生した場合
            LOGGER.error(getStackTrace(ex));
        }

        LOGGER.info("[E N D]" + CLASS_NAME);
    }
}

作成されるXMLファイルは以下通りです。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <child1/>
  <child2/>
</root>

関連記事

  1. ソースを見直し、一部、修正しました。

  1. トラックバック 0

return top