122

我正在使用 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>

想法?

4

7 回答 7

228

您需要启用 'INDENT' 并​​设置变压器的缩进量:

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

更新:


参考:如何在序列化之前从 DOM 中去除仅包含空格的文本节点?

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

于 2009-09-06T03:44:40.510 回答
23

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

  1. 将缩进数设置为transformerfactory
  2. 启用变压器中的缩进
  3. 用 writer(或 bufferedwriter)包装 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

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

于 2011-09-14T07:51:17.027 回答
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 的评论证明很有帮助。

于 2012-01-09T10:14:57.537 回答
8

导入 com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
于 2014-11-06T14:41:59.847 回答
6

如果你想要缩进,你必须将它指定给TransformerFactory.

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
于 2009-12-04T21:39:00.383 回答
4

我使用 Xerces (Apache) 库而不是使用 Transformer。添加库后,添加以下代码。

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer outxml = new FileWriter(new File("out.xml"));
XMLSerializer serializer = new XMLSerializer(outxml, format);
serializer.serialize(document);
于 2013-05-06T18:46:38.053 回答
4

对我来说,添加DOCTYPE_PUBLIC工作:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
于 2016-08-12T11:58:07.657 回答