问题

我正在使用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的评论证明是有帮助的。


原文链接