问题
我正在使用Java的内置XML转换器来获取DOM文档并打印出生成的XML。问题是尽管明确地设置了参数"indent",但它根本没有缩进文本。
示例代码
public class TestXML {
public static void main(String args[]) throws Exception {
ByteArrayOutputStream s;
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Transformer t = TransformerFactory.newInstance().newTransformer();
Element a,b;
a = d.createElement("a");
b = d.createElement("b");
a.appendChild(b);
d.appendChild(a);
t.setParameter(OutputKeys.INDENT, "yes");
s = new ByteArrayOutputStream();
t.transform(new DOMSource(d),new StreamResult(s));
System.out.println(new String(s.toByteArray()));
}
}
结果
<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>
期望的结果
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
思考?
#1 热门回答(194 赞)
你需要启用'INDENT'并设置变压器的缩进量:
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
更新:
参考:How to strip whitespace-only text nodes from a DOM before serialization?
(非常感谢所有成员,特别是@ marc-novakowski,@ james-murty和@saad):
#2 热门回答(19 赞)
这些建议的解决方案都不适合我。因此,我继续寻找替代解决方案,最终成为前面提到的第二步和第三步的混合。
- 将indent-number设置为transformerfactory
- 启用变压器中的缩进
- 用作者(或缓冲区)包装otuputstream
//(1)
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
//(2)
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
//(3)
t.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "utf-8"));
你必须执行(3)以解决xml处理代码的"错误"行为。
资料来源:johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(如果我错误地引用了我的来源,请告诉我)
#3 热门回答(14 赞)
以下代码适用于Java 7.我在变换器(而不是变压器工厂)上设置缩进(是)和缩进量(2)以使其正常工作。
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(source, result);
@ mabac设置属性的解决方案对我不起作用,但@ lapo的评论证明是有帮助的。