Java: 如何缩进转换器生成的 XML

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

有什么想法吗?

116588 次浏览

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

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

更新:


Reference : How to strip whitespace-only text nodes from a DOM before serialization?

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

如果需要缩进,则必须将其指定为 TransformerFactory

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();

这两个建议的解决办法对我都不起作用。所以我继续寻找另一种解决方案,结果是前面提到的两个方案和第三个步骤的混合。

  1. 将缩进号设置到变压器工厂
  2. enable the indent in the transformer
  3. 用一个写入器(或缓冲写入器)包装 outtuputstream
//(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 处理代码。

Source: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446

(如果我错误地引用了我的消息来源,请让我知道)

下面的代码适用于我的 Java7。我在变压器(不是变压器工厂)上设置了缩进(是的)和缩进量(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 的评论证明是有用的。

我使用了 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);

Import com.sun.org.apache.xml.interal.seralizer. OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");

对我来说,加入 DOCTYPE_PUBLIC是有效的:

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