`

java生成xml文件的时候如何控制xml的缩进格式

    博客分类:
  • Java
 
阅读更多

使用java自带的xml api生成的xml文件,其格式都是没有缩进的,每个element都是顶到最前面,今天终于找到了比较好的处理方法,赶紧记下来.

使用Java标准的JAXP来输出可以使用:
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(outputFile));
中间的红色代码是用于设置缩进的,比较遗憾的是JAXP只抽象出是否设置缩进(indent: yes|no),但并没有抽象出设置缩进量长度的常量(indent-number),所以默认的缩进量长度为0。如果有下面这样一个xml文档:<root><a><b>c</b></a></root>会被格式化为:
<root>
<a>
<b>c</b>
</a>
</root>
由于JAXP只是一个Java一个处理XML的框架,根据实现的不一样,可以传入实现特定的某个Key来设置缩进量。比如在Java 1.4下面,可以通过下面语句将缩进量设为2:
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "2");

transformer.setOutputProperty(
 "{http://xml.apache.org/xalan}indent-amount", "2");
上面两句不同之处仅在于命名空间。

而在Java 1.5下面,情况就有些复杂了。Java 1.5集成了JXAP 1.3(Java 1.4集成的是JXAP 1.1,不同之处参见http://java.sun.com/j2se/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html),实现基于Xerces类库。由于内部实现上的Bug,导致了设置缩进的不同:
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(new?BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile)))));
注意红色代码的不同之处。第一句设置TransformerFactory的indent-number属性,在Java 1.4下面运行会抛出异常,因为其不支持该属性,而在Java 1.5中却只能通过该属性来设置缩进。后面标为红色的代码则是由于Sun实现上的Bug,只有通过StreamResult(Writer)构造函数生成才能正确设置缩进(通过OutputStream或者File生成的StreamResult是无法设置缩进的,其实现上会忽略任何非正式的属性,而仅仅采用rt.jar下面com\sun\org\apache\xml\internal\serializer\output_xml.properties中的配置。详细可以在com.sun.org.apache.xml.internal.serializer.ToStream类的setOutputStream方法中加断点进行分析)
?
如果忽略掉可移植性,确认绑定在Sun的JRE实现上面,则可以通过如下代码来更好的实现:
OutputFormat format = new OutputFormat(document);
format.setIndenting(true);
format.setIndent(2);
Writer output = new BufferedWriter( new FileWriter(outputFile) );
XMLSerializer serializer = new XMLSerializer(output, format);
serializer.serialize(document);
但是OutputFormat类和XMLSerializer类都是位于com.sun.org.apache.xml.internal.serialize包下。

如果应用对增加一个300K左右的jar包不敏感的话,我还是强烈推荐用dom4j来处理xml,其API设计的非常易用,写出来的代码比用JXAP写出来的代码漂亮多了,也容易维护,也不会出现上面那种两个Java版本不兼容的问题。

分享到:
评论

相关推荐

    java生成xml文件的时候如何控制xml的缩进格式.pdf

    java生成xml文件的时候如何控制xml的缩进格式.pdf

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    mybatis generator源码修改

    3、调整java、xml文件写规则:如果已存在文件,先根据配置的overwrite判断是否覆盖;不覆盖则执行合并文件规则(默认的合并规则为跳过当前文件,java文件可自行实现合并规则) 4、修改文件的缩进方式为tab 使用方法...

    Mybatis逆向工程

    1.生成的mapper.xml文件中使用4个空格来缩进 2.生成的mapper.xml文件中每个元素间增加一空行,如insert,update,delete等之间增加一空行 3.去掉*mapper.xml文件中生成的注释 4.根据数据库表名及字段的注释为Java类、...

    JAVA源码文本-OpenRTF:开源RTF(富文本格式)Java库:tent:

    JAVA原始码OpenRTF是用于RTF(富文本格式)文件的开源Java库 OpenRTF是一个Java库,用于使用LGPL和MPL开源许可证创建和编辑RTF(富文本格式)文件。 我们欢迎其他开发人员的贡献。 请随时向此GitHub存储库提交拉取...

    完全免费的Java/jsp开发编辑工具FirstJava2

    2.Struts action向导:根据jsp文件中的表单内容自动生成的form类和action类的代码. 并修改struts-config.xml配置文件. 这个FirstJava2开发工具编辑辅助方式比Eclipse和Jbuild更高效,使简单, 自己使用Eclipse和Jbuild...

    mybatis-generator(mybatis生成工具修改版)

    4、原XML格式为两个个空格缩进,现增加两个空格,格式更加美观。 5、将原来生成的BeanMapper.java 改名为 IBeanDao.java,符合国人接口开发习惯。 6、XML中,原先会对每字段都写上jdbcType,现在去掉了,减少代码量...

    无垠式代码生成器最新功能与文档增强版0.7.22

    7)生成完整的Eclipse JEE版兼容的zip格式的压缩文件 8)内置SGS脚本(标准生成器脚本)编译器 9)部署请使用Java7和Tomcat7环境 10)部署时请首先使用Dynamic Web项目的wizard生成同名项目再把解压后源码包拷入即可编译。...

    FirstJava2完全教材

    2.Struts action向导:根据jsp文件中的表单内容自动生成的form类和action类的代码.并修改struts-config.xml配置文件. 编辑辅助方式比Eclipse和Jbuild更高效,使简单, 当你使用FirstJava2你会发现,它速度很快,功能...

    ftl模板生成的word文档打不开

    1.word模板另存为xml格式文件的时候,选择Word 2003 XML格式(兼容问题) 2.模板中有图片的时候,将ftl文件中图片的base64编码改成变量${xxx} 改为对应的变量名 3.图片的标签必须在同一行,不能跳行,中间不能加...

    ArxmlEditor:Arxml编辑器,使用Eclipse XML编辑器

    ARXML Editor是基于Eclipse XML Editor的,它基本上具有Eclipse XML Editor的功能,以及以下功能: 自动缩进,然后输入SHORT-NAME标签。 自动搜索架构位置 内容辅助,用于编写可引用类的路径 要求 面向Java和DSL...

    Visual JDevpro

    13、支持代码缩进以及自动格式化等; 14、支持代码自动完成; 15、支持编译java程序,可以快速定位错误所在位置; 16、支持通用的编辑功能,如剪切、拷贝、粘贴等; 17、支持书签功能; 18、编辑区支持多种选择...

    fckedit编辑器

    FormatIndentator="" 当在源码格式下缩进代码使用的字符 FormatOutput=true/false 当输出内容时是否自动格式化代码 FormatSource=true/false 在切换到代码视图时是否自动格式化代码 FullPage=true/false 是否允许...

    jaguar-forge-addon:Forge Addon 创建 Jaguar 项目和脚手架

    捷豹锻造插件jaguar-forge-addon 使开发人员能够生成使用 Jaguar 框架 ( ) 的 Java 项目。 此插件提供独立功能,可以在其他插件中重复使用。依赖项:取决于添加在出口可选的CDI 不不行家不不项目不不设置此插件需要...

Global site tag (gtag.js) - Google Analytics