JDom解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/12137845一、前言
JDom是一套非常优秀的java开源api,主要用于读写xml文档,具有性能优异、功能强大、和非常方便使用的特点,并且把jdk自带的解析方式SAX和Dom的功能有效地结合起来。经过实践操作发现dom4j和jdom解析xml的时候有一些相似的地方,故可以比对一下解析的性能和实现方式的效率。
jdom.jar
下载地址:http://download.csdn.net/detail/ch656409110/6334543
实现思路:
<1>创建SAX创建者对象的实例;
<2>根据读取的xml路径,传递给SAXBuilder的实例之后 返回一个Document文档对象;
<3>然后操作这个Document对象,获取下面的节点以及子节点的信息。
具体代码如下:
根据控制台显示可知:
<1>如果new SAXBuilder(false)指定为true,指定运行会报错:Document is invalid: no grammar found. 简单的说就是没有导入语法文件,比如dtd文件等等,所以jdom在验证xml规范的时候还是非常严格的;
<2>这里发现jdom解析xml区分大小写,就是区分指定节点名称,但是dom4j是不区分的;<3>有些情况xml比较复杂,规范不统一,某个节点不存在直接报错:java.lang.NullPointerException,所以获取到element对象之后要先判断一下是否为空。
上面只是简单的获取了xml的根目录的元素,接下来使用ArrayList集合循环document文档对象。
具体代码如下:
根据控制台显示可知:
<1>直接解析就会报错:Error on line 11: The content of elements must consist of well-formed character data or markup. 因为标签的内容中包含标签标记符号,使用<![CDATA[]]>标记会被当成文本信息不被解析;
<2>因为是getChildren("Element");有指定具体元素名称,所以只会获取Element节点,另外节点的子节点包含Element节点不会被获取,所以getChildren("Element");没有递归获取子元素;
jdom不但能够解析xml对象,并且在解析的时候还可以操作document对象,重新构造一个新的Document文档对象。具体代码如下:
根据控制台显示可知:
<1>执行上面的修改根节点操作会影响下面,因为setText()会直接覆盖掉根节点下的子节点;
<2>开始删除节点使用的是rootElement.removeContent(element);直接删除节点的方法,直接报错:Exception in thread "main" java.util.ConcurrentModificationException 除非删除之后立刻执行break;另外调用element.removeContent();就不会出现这样的问题;<3>根据输出节点集合的个数可知,再循环的时候改变集合数量会直接影响循环,因为循环过程中并没有随着数量的修改而改变循环的次数。但element.removeContent(); 不一样,循环至始至终集合数量都没有发生改变,只是将这个节点的引用置为null了。
2、生成xml文档
JDom能够解析xml,同样肯定能生成xml,而且使用起来更加简单方便。
实现思路:
<1>创建Document对象,添加节点以及节点下的文本、名称和属性值;
<2>创建XMLOutputter的实例,调用output()方法把document写入磁盘;
具体代码如下:
实践发现:
<1>如果不指定编码,生成的xml默认是UTF-8编码的;
<2>节点内的文本内容包含标签标记符都会被转义成< > ,,但是其他特殊符号就不会,比如空格,双引用,单引号,斜杠 等等。三、几种解析XML方式的比较
前面依次介绍了三种操作xml的方式,分别是:
Dom4j解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11486271
Dom解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11662667
SAX解析和生成XML文档, 地址:http://blog.csdn.net/chenghui0317/article/details/11990891
<1>Dom4j的xml解析性能最好,目前有许多开源项目都在使用Dom4j解析xml文档,比如hibernate,另外Dom4j解析的时候采用面向对象,所有的节点都是用Element封装之后返回,非常方便使用和调用;
<2>SAX解析xml性能较好,因为它是采用DefaultHandler事件处理者来解析的,但是不好的地方在于每一个节点的名称,属性和内容都被分开了,也没有使用对象封装,所以在解析之后封装对象上面比较麻烦,稍微不注意就会使空文本覆盖掉应该存放的值;
<3>JDom在解析xml性能上表现不是很好,虽然JDom 和 Dom4j在解析上有很多相似之后,大多差距都是方法名称不同但是具体含义相同,所以使用起来还是蛮方便的;
<4>Dom在解析xml性能上表现也不是很好,另外Dom在解析xml使用的时候感觉是最不方便的,Dom并没有把解析的节点封装成对象,并且很容易受到非空内容的节点影响,导致解析抛异常。