次の簡単なコードを使用します。
package test;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class TestOutputKeys {
public static void main(String[] args) throws TransformerException {
// Instantiate transformer input
Source xmlInput = new StreamSource(new StringReader(
"<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
StreamResult xmlOutput = new StreamResult(new StringWriter());
// Configure transformer
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(); // An identity transformer
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
System.out.println(xmlOutput.getWriter().toString());
}
}
出力が得られます:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
質問 A: ドキュメント コメントの後に doctype タグが表示されます。ドキュメントのコメントの前に表示することはできますか?
質問 B: JavaSE 5.0 API のみを使用してインデントを実現するにはどうすればよいですか? この質問は基本的にHow to pretty-print xml from javaと同じですが、その質問のほとんどすべての回答は外部ライブラリに依存しています。JavaのAPIのみを使用する唯一の適用可能な回答(Lorenzo Boccacciaという名前のユーザーが投稿)は、基本的に上記のコードと同じですが、私にとっては機能しません(出力に示されているように、インデントはありません)。
外部ライブラリの回答の多くがそうであるように、インデントに使用するスペースの量を設定する必要があると推測していますが、Java APIでそれを指定する場所が見つかりません。インデント プロパティを "yes" に設定する可能性が Java API に存在するという事実を考えると、何らかの形でインデントを実行できるはずです。方法がわかりません。