Java:如何缩进由 Transformer 生成的 XML

2022-08-31 08:46:54

我正在使用Java的内置XML转换器来获取DOM文档并打印出生成的XML。问题在于,尽管显式设置了参数“缩进”,但它根本没有缩进文本。

示例代码

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

您需要启用“缩进”并设置转换器的缩进量:

t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

更新:


参考 :如何在序列化之前从DOM中剥离仅空格的文本节点?

(非常感谢所有成员,特别是@marc-novakowski,@james-murty和@saad)


答案 2

建议的解决方案都不适合我。因此,我一直在寻找替代解决方案,最终成为前面提到的两者的混合和第三步。

  1. 将缩进号设置到转换器工厂中
  2. 使压痕在变压器中
  3. 用编写器(或缓冲编写器)包装 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

(如果我错误地引用了我的来源,请告诉我)


推荐