Java:如何缩进由Transform生成的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"?>
期望的结果
思考?
7个解决方案
203 votes
您需要启用'INDENT'并设置变压器的缩进量:
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
更新:
参考:如何在序列化之前从DOM中删除仅空白文本节点?
(非常感谢所有成员,特别是@ marc-novakowski,@ james-murty和@saad):
adatapost answered 2019-07-23T09:21:12Z
19 votes
这些建议的解决方案都不适合我。 所以我一直在寻找替代解决方案,最终成为前面提到的第二步和第三步的混合。
将indent-number设置为transformerfactory
启用变压器中的缩进
用作者(或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]
(如果我错误地引用了我的来源,请告诉我)
mabac answered 2019-07-23T09:22:19Z
14 votes
以下代码适用于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的评论证明是有帮助的。
remipod answered 2019-07-23T09:22:51Z
8 votes
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
answered 2019-07-23T09:23:15Z
4 votes
如果要缩进,则必须将其指定为TransformerFactory。
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
lucbelanger answered 2019-07-23T09:23:45Z
4 votes
我使用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);
sevensevens answered 2019-07-23T09:24:13Z
2 votes
对我来说添加DOCTYPE_PUBLIC工作:
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
Vikas Chowdhury answered 2019-07-23T09:24:42Z