- 浏览: 130978 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (84)
- Java (30)
- C/C++ (3)
- Linux (1)
- 数据库 (19)
- 搜索引擎 (1)
- 数据结构 (2)
- 杂七杂八 (4)
- WEB前端 (6)
- Spring (2)
- JavaScript (9)
- DHTMLX (3)
- 正则表达式 (1)
- JQuery (1)
- Report (2)
- PDF (2)
- Word (0)
- Excel (0)
- CSV (0)
- Test & QA (1)
- BI (Business Intelligence) (10)
- SQL (18)
- SAP Business Object (0)
- DataStage (3)
- CI (Continuous Integration) (1)
- Algorith (3)
- Portal (1)
- Struts (1)
- Oracle (9)
- MS SQL Server (3)
- Teradata (3)
- MySql (1)
- Data Warehouse (5)
- ETL (8)
使用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版本不兼容的问题。
发表评论
-
优秀程序员不得不知道的20个位运算技巧 【转】
2012-12-14 11:19 1453【转载】一提起位运算,人们往往想到它的高效性,无论是嵌入式编程 ... -
java导出csv用excel打开后数字不用科学计数法显示
2011-08-15 14:27 21907最近写了一个生成csv的程序,生成的csv其中有一列数字长度 ... -
java读取配置文件的几种方法
2011-07-21 12:17 714java读取配置文件的几种方法 在现实工 ... -
正则表达式语法
2011-07-18 10:52 688一个正则表达式就是 ... -
CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全)
2011-07-08 16:18 1067JDBC事务管理 Spring提供编程式的事务管理(Progr ... -
Spring:JdbcTemplate使用指南
2011-07-07 21:35 980前言: 本文指在介绍 Spring 框架 ... -
Java DATE 工具类
2011-07-05 12:18 2357public class DateUtil { / ... -
java中取小数点后两位(四种方法)
2011-07-01 16:33 1768一 Long是长整型,怎么有小数,是double吧 ... -
Java正则表达式(一)
2011-06-30 20:14 831正则表达式在处理文本方面用处非常大,最早像在Perl和awk语 ... -
Java正则表达式(二)
2011-06-30 20:13 959Matcher类: 使用Matcher类,最重要的一个概念必须 ... -
DBUnit入门
2011-04-28 15:55 757相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的 ... -
一些经典算法题目
2011-02-03 21:28 8571.写一个方法,用一个fo ... -
求最大子序列和问题的最优算法
2010-12-17 19:42 845//求最大子序列和问题, public class ... -
Java UDP通信(DatagramPacket类、DatagramSocket类、InetAddress类)
2010-11-30 22:16 1445一、DatagramPacket类: 如果把Datagram ... -
Java向服务器发送POST请求
2010-10-30 19:06 2396public String sendToServer(Stri ... -
Java发送Http请求,解析html返回
2010-10-30 18:53 2008首先,向一个Web站点发送POST请求只需要简单的几步: 注 ... -
Struts1和Struts2的区别和对比
2010-10-30 13:23 8231.Action 类: • Struts1要求Action类 ... -
java.net.URL的URL构建方式
2010-10-30 13:21 842Tag:java.net.URL URL构建方式 ... -
Vector遍历的通用实现
2010-10-27 19:53 1535对于Vector,如果我们不用遍历,那么就要自己去写循环,也是 ... -
Http和Socket连接区别
2010-10-27 11:58 762Http和Socket连接区别 1、 ...
相关推荐
java生成xml文件的时候如何控制xml的缩进格式.pdf
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
3、调整java、xml文件写规则:如果已存在文件,先根据配置的overwrite判断是否覆盖;不覆盖则执行合并文件规则(默认的合并规则为跳过当前文件,java文件可自行实现合并规则) 4、修改文件的缩进方式为tab 使用方法...
1.生成的mapper.xml文件中使用4个空格来缩进 2.生成的mapper.xml文件中每个元素间增加一空行,如insert,update,delete等之间增加一空行 3.去掉*mapper.xml文件中生成的注释 4.根据数据库表名及字段的注释为Java类、...
JAVA原始码OpenRTF是用于RTF(富文本格式)文件的开源Java库 OpenRTF是一个Java库,用于使用LGPL和MPL开源许可证创建和编辑RTF(富文本格式)文件。 我们欢迎其他开发人员的贡献。 请随时向此GitHub存储库提交拉取...
2.Struts action向导:根据jsp文件中的表单内容自动生成的form类和action类的代码. 并修改struts-config.xml配置文件. 这个FirstJava2开发工具编辑辅助方式比Eclipse和Jbuild更高效,使简单, 自己使用Eclipse和Jbuild...
4、原XML格式为两个个空格缩进,现增加两个空格,格式更加美观。 5、将原来生成的BeanMapper.java 改名为 IBeanDao.java,符合国人接口开发习惯。 6、XML中,原先会对每字段都写上jdbcType,现在去掉了,减少代码量...
7)生成完整的Eclipse JEE版兼容的zip格式的压缩文件 8)内置SGS脚本(标准生成器脚本)编译器 9)部署请使用Java7和Tomcat7环境 10)部署时请首先使用Dynamic Web项目的wizard生成同名项目再把解压后源码包拷入即可编译。...
2.Struts action向导:根据jsp文件中的表单内容自动生成的form类和action类的代码.并修改struts-config.xml配置文件. 编辑辅助方式比Eclipse和Jbuild更高效,使简单, 当你使用FirstJava2你会发现,它速度很快,功能...
1.word模板另存为xml格式文件的时候,选择Word 2003 XML格式(兼容问题) 2.模板中有图片的时候,将ftl文件中图片的base64编码改成变量${xxx} 改为对应的变量名 3.图片的标签必须在同一行,不能跳行,中间不能加...
ARXML Editor是基于Eclipse XML Editor的,它基本上具有Eclipse XML Editor的功能,以及以下功能: 自动缩进,然后输入SHORT-NAME标签。 自动搜索架构位置 内容辅助,用于编写可引用类的路径 要求 面向Java和DSL...
13、支持代码缩进以及自动格式化等; 14、支持代码自动完成; 15、支持编译java程序,可以快速定位错误所在位置; 16、支持通用的编辑功能,如剪切、拷贝、粘贴等; 17、支持书签功能; 18、编辑区支持多种选择...
FormatIndentator="" 当在源码格式下缩进代码使用的字符 FormatOutput=true/false 当输出内容时是否自动格式化代码 FormatSource=true/false 在切换到代码视图时是否自动格式化代码 FullPage=true/false 是否允许...
捷豹锻造插件jaguar-forge-addon 使开发人员能够生成使用 Jaguar 框架 ( ) 的 Java 项目。 此插件提供独立功能,可以在其他插件中重复使用。依赖项:取决于添加在出口可选的CDI 不不行家不不项目不不设置此插件需要...