`

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生成Xml文件

    ### Java生成XML文件:控制XML的缩进格式 在Java中生成XML文件是一项常见的任务,尤其是在需要与外部系统交互或存储结构化数据时。本文主要介绍如何使用Java自动生成带有适当缩进格式的XML文件。 #### 一、背景...

    格式化xml字符串,并生成xml文件

    本文将围绕“格式化XML字符串并生成XML文件”这一主题展开,结合提供的标签“源码”和“工具”,探讨如何通过Java编程实现这一功能。 首先,我们有两个Java源代码文件,即`XMLFileUtil.java`和`XMLFormatUtil.java`...

    JAVA生成XML文件.doc

    ### JAVA生成XML文件知识点 #### 一、简介 在Java编程中,生成XML文件是一种常见的需求,尤其是在数据交换、配置管理或系统间通信时。本文档通过一个具体的示例介绍了如何使用Java语言来生成XML文件,并对代码进行...

    java生成Xml文件.pdf

    在标题“java生成Xml文件.pdf”中,我们要探讨的是使用Java语言来创建或生成XML文件的相关知识点。XML(可扩展标记语言)是一种标记语言,用于存储和传输数据,它比HTML更为通用和灵活。Java提供了丰富的API来操作...

    java生成xml格式文件的方法

    以下将详细解释如何使用Java生成XML文件,包括节点遍历和属性操作。 首先,我们需要引入必要的库,这里是`jdom.jar`,它是一个用于处理XML的Java库。在示例代码中,我们导入了`org.jdom`包下的几个类,包括`...

    w3c 生成xml 文件

    本篇文章将详细介绍如何使用Java结合W3C DOM API来生成XML文件。 首先,生成XML文件的基本步骤包括: 1. 创建`DocumentBuilderFactory`实例:这是工厂模式的一个应用,用于创建`DocumentBuilder`对象,后者可以...

    使用java代码生成json文件和word文档!

    总结,使用Java生成JSON文件和Word文档需要理解数据序列化(如JSON)的概念,以及使用相关库(如Jackson和Apache POI)提供的API。通过这些库,你可以轻松地将Java对象转换为可读的JSON格式,或创建结构化的Word文档...

    数据库数据生成xml

    总的来说,将数据库数据生成XML是一项关键的技术,它促进了数据的标准化、互操作性和可移植性,广泛应用于数据交换、API交互、配置文件存储等多个领域。通过理解这一过程,开发者可以更有效地处理数据传输和集成任务...

    java xml拼接

    当需要与数据库交互并生成XML文件时,Java JDBC(Java Database Connectivity)提供了一种强大的方式来连接和操作数据库,然后将查询结果转化为XML格式。以下将详细讲解这个过程中的关键知识点。 首先,我们需要...

    Pull解析与生成Xml

    我们将讲解如何使用Pull解析器读取本地XML文件,并生成一个新的、格式不同的XML文件。 Pull解析是一种事件驱动的解析方法,它不像DOM解析那样将整个XML文档加载到内存中,而是按需逐个处理XML元素。这种方法节省了...

    freemarker格式化缩进文本或include指令

    FreeMarker是一个强大的、开源的模板引擎,主要用于生成动态HTML、XML或其他格式的文本输出,尤其在Web应用开发中被广泛使用。它与Java语言紧密集成,允许开发者通过模板语言(Template Language)来分离应用程序的...

    Java编程中更新XML文档的常用方法集

    在Java程序中,通过Transformer的setOutputProperties方法,可以设置XML输出的格式属性,如“indent”控制缩进,“omit-xml-declaration”控制是否省略XML声明等。例如,设置"indent"属性为"yes"可以生成带缩进的XML...

    JDOM实现从数据库读取字段生成XML树

    `XMLOutputter`提供了格式化输出的功能,可以控制XML的缩进和换行。 在提供的压缩包文件中,"cao.java"可能是实现上述逻辑的Java源代码。而"sqlsever2005表jdom树.rar"可能包含了SQL Server 2005相关的数据库表信息...

    XML.rar_XML java_java xml_java xml Document sa_xml

    注意,通过设置`transformer.setOutputProperty()`可以控制XML输出的格式,例如这里设置了缩进以提高可读性。 在提供的压缩文件中,“Save Document object to XML file - johnsdilon - BlogJava.htm”可能是一个...

    java xml-repair修复工具类

    Java XML-repair修复工具类是Java编程中处理XML文档时的一种实用工具,它主要用于修复XML文件的格式问题,确保XML文档符合W3C标准,从而能够被正确解析和处理。XML(eXtensible Markup Language)是一种用于标记数据...

    通过jdom生成xml

    在Java编程中,生成XML文件是一项常见的任务,用于数据存储、配置管理或数据交换。JDOM(Java Document Object Model)是一个流行的库,专门用于处理XML文档。本篇将详细介绍如何利用JDOM在Java中生成XML文件,以及...

    Markup带缩进(Unicode)

    关于压缩包子文件的文件名称列表,"Markup带缩进(Unicode)"可能是一个包含了改进后的XML处理代码的文件,可能是一个源代码文件(如.cpp或.java),或者是使用这种改进后的工具生成的示例XML文件。为了深入理解这个...

    ftl排版-xml格式化.zip

    3. **自动格式化**:可以自动调整XML文档的缩进和换行,使其符合标准格式。 4. **验证**:检查XML文档是否符合指定的DTD(文档类型定义)或XSD(XML Schema Definition)。 5. **查找和替换**:在大量XML数据中快速...

Global site tag (gtag.js) - Google Analytics