使用以下简单代码:
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相同,然而那个问题中几乎所有的答案都依赖于外部库。唯一可行的答案(由名为Lorenzo Boccaccia的用户发布),基本上等同于上面发布的代码,但对我不起作用(如输出所示,我没有得到缩进)。
我猜您必须设置要用于缩进的空格数量,因为许多具有外部库的答案都是这样做的,但我只是找不到在Java API中指定缩进属性的位置。鉴于在Java API中存在设置缩进属性为“是”的可能性,必须有一种方法来执行缩进。我只是想不出怎么做。
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
。 - George Hawkins