java DOM4J操作XML例子以及DOM、SAX、JDOM、DOM4J的区别

来源:互联网 发布:淘宝宝贝刷收藏软件 编辑:程序博客网 时间:2024/05/24 04:12

1.介绍

     XML(extensible markup language)可扩展标记语言,无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

     在java中常见的有四种解析XML的方式 DOM、SAX、JDOM、DOM4J。下面方便简单介绍下,最后会有一个DOM4J解析、修改XML的例子,因为DOM4J是目前这4种方法里性能最好,功能最强、最经常使用的。

 2.DOM

DOM(document object model)是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许解析和操作文档的任意部分,是W3C的官方标准

优点:1.允许应用程序对数据和结构做出更改;

            2.访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据;

缺点:1.在解析前需要把整个XML文档载入内存,比较耗内存;

            2.性能不好;

            3.操作起来比较繁琐

3.SAX

Sax(simple API for XML)拥有通过事件驱动API,每发现一个节点就引发一个事件,事件推给事件处理器,通过回调方法完成解析工作,SAX只能解析XML不能对XML进行修改删除操作。

优点:1.SAX在某些方面要优于DOM,在内存使用方面比DOM少,因为它不需要把整个XML文件载入内存;

            2.相对于DOM解析器,SAX的解析效率更高,可以解析大于系统内存的文件;

缺点:1.单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。

4.JDOM

JDOM(java document object model)Java特定的文档对象模型。自身不包含解析器,一般使用SAX解析xml。使用时需要映入jdom.jar包 。

优点:1.使用具体类而不是接口,简化了DOM的API;
            2.大量使用了Java集合类,方便了Java开发人员;

            3.速度快

缺点:1.不能处理大于内存的文档;

            2.灵活性不高

5.DOM4J

Dom4j(documentobject model for java)是个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,是dom4j.org出品的一个开源XML解析包,一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

现在很多java软件都使用DOM4J解析XML,包括hibernate。

使用DOM4J时需要导入DOM4J.jar 和jaxen.jar两个包,

(如果没有导入jaxen.jar包,而在代码中使用了selectNodes()会报java.lang.NoClassDefFoundError: org/jaxen/JaxenException错误


DOM4J解析、修改XML的例子:(关于xpath的用法可以点击看这里)

xml文件

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="students.xsl"?><students>     <student sn="01"  flag="ok">       <name>sam</name>       <age>18</age>    </student>    <student sn="01">       <name>sam</name>       <age>18</age>    </student>    <student sn="02">       <name>lin</name>       <age>20</age>    </student>    <s>ss</s>    <complex att="att1">      <node1>node1</node1>    </complex></students>

java代码:

package com.dxswzj.dom;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class xmlCRUDDOM4J {public void modifyDocument(File inputXml) {       try {           SAXReader saxReader = new SAXReader();           Document document = saxReader.read(inputXml);           Node node = document.selectSingleNode("//students/s");           System.out.println(node.getText());                                 Node node2 = document.selectSingleNode("//students/complex");           node2.setName("ff");//修改节点的名称                     //查询节点为student 属性sn=“01”的节点, 如果过滤多个属性的话 这样写 "//students/student[@sn='01' and @flag='ok']"            List list0 = document.selectNodes("//students/student[@sn='01']");           Iterator iter0 = list0.iterator();           while(iter0.hasNext()){           Element elm = (Element)iter0.next();           Iterator iterAge = elm.elementIterator("age");           while(iterAge.hasNext()){           Element elmAge = (Element)iterAge.next();           elmAge.setText("202");           }           }                      //后面加个@标示是找属性的 list里保存是属性 迭代的时候 Attribute attribute = (Attribute) iter.next();           List list = document.selectNodes("//students/student/@sn");           Iterator iter = list.iterator();           while (iter.hasNext()) {              Attribute attribute = (Attribute) iter.next();              if (attribute.getValue().equals("01"))                  attribute.setValue("001");           }            list = document.selectNodes("//students/student");           iter = list.iterator();           while (iter.hasNext()) {              Element element = (Element) iter.next();              Iterator iterator = element.elementIterator("name");              while (iterator.hasNext()) {                  Element nameElement = (Element) iterator.next();                  if (nameElement.getText().equals("sam"))                     nameElement.setText("jeff");              }           }            XMLWriter output = new XMLWriter(new FileWriter(new File(                  "modified.xml")));           output.write(document);           output.close();       }        catch (DocumentException e) {           System.out.println(e.getMessage());       } catch (IOException e) {           System.out.println(e.getMessage());       }    }   public static void main(String[] argv) {   xmlCRUDDOM4J dom4jParser = new xmlCRUDDOM4J();       dom4jParser.modifyDocument(new File("students-gen.xml"));    }}

修改后得到的XML

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="students.xsl"?><students>     <student sn="001" flag="ok">       <name>jeff</name>       <age>202</age>    </student>    <student sn="001">       <name>jeff</name>       <age>202</age>    </student>    <student sn="02">       <name>lin</name>       <age>20</age>    </student>    <s>ss</s>    <ff att="att1">      <node1>node1</node1>      <k>sfsss</k>    </ff>    <k>sf</k></students>