DOM解析XML的缩进问题(JAVA)

在Java中使用DOM解析XML时,通过Transformer设置缩进可能导致版本兼容性问题。JAXP仅提供是否开启缩进的选项,未提供缩进量控制。在Java 1.4中,可以通过特定命名空间设置缩进量,如Apache Xalan的"{http://xml.apache.org/xalan}indent-amount"。但在Java 1.5中,需要设置TransformerFactory的"indent-number"属性,并使用StreamResult的Writer构造函数来确保缩进生效。尽管如此,不同实现可能会忽略非标准属性,例如Sun的实现。文章建议使用dom4j处理XML,但可能因版权问题受到限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Transformer transformer = TransformerFactory.newInstance().newTransformer(); [color=red]transformer.setOutputProperty(OutputKeys.INDENT, "yes");[/color] transformer.transform(new DOMSource(document), new StreamResult(outputFile)); 中间的红色代码是用于设置缩进的,比较遗憾的是JAXP只抽象出是否设置缩进(indent: yes|no),但并没有抽象出设置缩进量长度的常量(indent-number),所以默认的缩进量[/size] [size=4]长度为0。如果有下面这样一个xml文档:c会被格式化为: c 由于JAXP只是一个Java一个处理XML的框架,根据实现的不一样,可以传入实现特定的某个Key来设置缩进量。比如在Java 1.4下面,可以通过下面语句将缩进量设为2: ransformer.setOutputProperty( "{[url]http://xml.apache.org/xslt[/url]}indent-amount", "2"); 或 transformer.setOutputProperty( "{[url]http://xml.apache.org/xalan[/url]}indent-amount", "2"); 上面两句不同之处仅在于命名空间。[/size] [size=4]而在Java 1.5下面,情况就有些复杂了。Java 1.5集成了JXAP 1.3(Java 1.4集成的是JXAP 1.1),实现基于Xerces类库。由于内部实现上的Bug,导致了设置缩进的不同: TransformerFactory tf = TransformerFactory.newInstance(); [color=red]tf.setAttribute("indent-number", new Integer(2));[/color] Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(new DOMSource(document), [color=red]new StreamResult(new?BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile)))));[/color] 注意红色代码的不同之处。第一句设置TransformerFactory的indent-number属性,在Java 1.4下面运行会抛出异常,因为其不支持该属性,而在Java 1.5中却只能通过该属性来设[/size][size=4]置缩进。后面标为红色的代码则是由于Sun实现上的Bug,只有通过StreamResult(Writer)构造函数生成才能正确设置缩进通过OutputStream或者File生成的StreamResult是无法[/size][size=4]设置缩进的,其实现上会忽略任何非正式的属性,而仅仅采用rt.jar下面com/sun/org/apache/xml/internal/serializer/output_xml.properties中的配置。详细可以在[/size][size=4]com.sun.org.apache.xml.internal.serializer.ToStream类的setOutputStream方法中加断点进行分析)。实现后[/size] [size=4] c [/size] [color=olive]强烈推荐用dom4j来处理xml,其API设计的非常易用,写出来的代码比用JXAP写出来的代码漂亮多了,也容易维护,也不会出现上面那种两个Java版本不兼容的问题。但华为怕引起版权问题,所以外部包要求尽量少用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值