次の簡単なコードを使用します。
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のみを使用してインデントを実現するにはどうすればよいですか?この質問は基本的に JavaからXMLをきれいに印刷する方法 、howeverとほぼ同じです。ライブラリ。 JavaのAPIのみを使用する唯一の適用可能な回答(Lorenzo Boccacciaというユーザーが投稿)は、基本的に上記のコードと同じですが、私には機能しません(出力に示されているように、インデントはありません)。
外部ライブラリでの回答の多くが行うように、インデントに使用するスペースの量を設定する必要があると推測していますが、Java api。インデントプロパティを「yes」に設定する可能性がJava apiに存在するという事実を考えると、何らかの方法でインデントを実行できる必要があります。どうすればよいかわかりません。
欠けている部分はインデントする量です。インデントとインデントの量は次のように設定できます。
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
例として小さなutilクラス...
import org.Apache.xml.serialize.XMLSerializer;
public class XmlUtil {
public static Document file2Document(File file) throws Exception {
if (file == null || !file.exists()) {
throw new IllegalArgumentException("File must exist![" + file == null ? "NULL"
: ("Could not be found: " + file.getAbsolutePath()) + "]");
}
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
return dbFactory.newDocumentBuilder().parse(new FileInputStream(file));
}
public static Document string2Document(String xml) throws Exception {
InputSource src = new InputSource(new StringReader(xml));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
return dbFactory.newDocumentBuilder().parse(src);
}
public static OutputFormat getPrettyPrintFormat() {
OutputFormat format = new OutputFormat();
format.setLineWidth(120);
format.setIndenting(true);
format.setIndent(2);
format.setEncoding("UTF-8");
return format;
}
public static String document2String(Document doc, OutputFormat format) throws Exception {
StringWriter stringOut = new StringWriter();
XMLSerializer serial = new XMLSerializer(stringOut, format);
serial.serialize(doc);
return stringOut.toString();
}
public static String document2String(Document doc) throws Exception {
return XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}
public static void document2File(Document doc, File file) throws Exception {
XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}
public static void document2File(Document doc, File file, OutputFormat format) throws Exception {
XMLSerializer serializer = new XMLSerializer(new FileOutputStream(file), format);
serializer.serialize(doc);
}
}
XMLserializerは、 Apache Foundation のxercesImplによって提供されます。 Mavenの依存関係は次のとおりです。
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
お気に入りのビルドツールの依存関係は、ここで見つけることができます: http://mvnrepository.com/artifact/xerces/xercesImpl/2.11. 。
おそらく XSLTファイル ですべてをきれいにすることができます。 Googleはいくつかの結果を表示しますが、その正確性についてコメントすることはできません。
出力を有効なXMLドキュメントにするために、いいえ。有効なXMLドキュメントは、処理命令で始まる必要があります。詳細については、XML仕様 http://www.w3.org/TR/REC-xml/#sec-prolog-dtd を参照してください。