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

我正在使用Java内置的XML转换器来获取DOM文档并打印出生成的XML。 问题是,尽pipe已经明确地设置了参数“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> 

思考?

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

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

更新:


参考: 如何在序列化之前从DOM删除仅空白的文本节点?

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

build议的解决scheme都不适合我。 所以我一直在寻找另一种解决scheme,最后是前面提到的两种方法的混合,第三步。

  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

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

下面的代码在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的解决scheme设置属性不适用于我,但@ lapo的评论certificate是有帮助的。

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

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

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

如果你想缩进,你必须指定它到TransformerFactory

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

对于我添加DOCTYPE_PUBLIC工作:

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