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,最后是前面提到的两种方法的混合,第三步。
- 将缩进号码设置为变形工厂
- 启用变压器的缩进
- 用写入器(或缓冲写入器)包装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");