java里怎么反缩进_Java:如何缩进由Transform生成的XML

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值