【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析

DOM4J来源:

Dom4j(Document For Java)-第三方开源,是从jdom分裂出来的解析技术。目前jdom已经完全被dom4j替代。

【注意】:

①jDom – Dom4j的前身。

②Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找

③目前像Spring,Hibernate这些大型的框架,都是用的dom4j.

④支持文档的读写功能和Xpath快速查询操作。

【DOM4J开源包目录】:
【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第1张图片【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第2张图片

如何学习DOM4J?

/**
*
* 学习方法:
* 1) 打开dom4j项目包中docs/index.html –> Quick Start –> 在这一页中介绍了dom4j的基本操作
* 2) index.html –> javadoc(1.6.1) –> 进入该版本的API文档,可以查看每个包中的类及方法的说明
* 3) 官网: http://www.dom4j.org/
*
*/

详细图解:::

dom4j-1.6.1/docs/index.html:

【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第3张图片

Quick start:

★★从这里开始,我们能够了解到关于dom4j★★:

Parsing XML、

Using Iterators、

Powerful Navigation with XPath、

Fast Looping、

Creating a new XML document、

Writing a document to a file、

Converting to and from Strings、

Styling a Document with XSLT

Javadoc:

在这里我们就可以使用JOM4J的API了,关键的核心技术在这里都能找到,开始学习API吧!

【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第4张图片

开始用dom4j解析xml文档:

有了上面的简单了解,可以使用dom4j技术解析xml文档了。

例子:我们开始解析users.xml文档:

所要解析的xml文档:


<users> 
  <user id="A001"> 
    <name>Jackname>  
    <age>22age> 
  user>  
  <user id="A002"> 
    <name>张三name>  
    <age>24age> 
  user>  
  <user id="B001"> 
    <name>小李name>  
    <age>20age> 
  user>  
  <user id="B002"> 
    <name>小张name>  
    <age>28age> 
  user>  
  <user id="0777"> 
    <name>湖南城市大学name>  
    <age>1200age> 
  user>  


users>

(一)如何通过dom4j获得dom对象?

核心代码:

SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");

★【注意】:所使用的包:org.dom4j.io

有了包,在此我们引出DOM4J的类层次:::

【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第5张图片

【特别注意】:由于之前学过DOM解析,特别容易将org.w3c.dom与org.dom4j.io包混淆,在以后的dom4j解析编程中,Node(节点),Element(元素)、Document(文档) 这些重要的内容都是从dom4j获得。

(二)如何获得子元素?

★★什么是子元素?

dom的子元素包括了:

【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析_第6张图片

主要是:element(),elements()

①获得单个子元素就是用以下方法获得:

element(String name)、

② 获得所有的元素用以下方法获得:

elements():List
elements(String name):List

③还可以通过迭代器来获得单个元素或所有元素:

elementIterator():Iterator
elementIterator(String name):Iterator

代码演示:

public void helloDom4j() throws DocumentException {
    // 获取DOM对象
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");

    // 获取根元素
    Element root = dom.getRootElement();
    // 获取根元素的name
    String rootName = root.getName();
    System.out.println(rootName);
    /*
     * 获取根元素下的子元素的一些方法: root.elements() //获取所有的子元素java.util.List
     * root.element(qName)//获取指定名称的第一个元素 root.elements(qName)//获取指定名称的所有子元素
     * root.elementIterator()//获取所有的元素--迭代器
     * root.elementIterator(qName)//获取指定名称的所有子元素
     */

    // 需求:把第一个的信息提取出来
    Element eUser = root.element("user");
    String id = eUser.attributeValue("id");
    String name = eUser.element("name").getTextTrim();
    String age = eUser.elementText("age");
    System.out.println(id + "," + name + "," + age);// 结果:A001,Jack,22
}

运行结果:

这里写图片描述

利用DOM4J对XML文档进行增删改查:

有了以上的基础,可以对XML文档进行一系列的操作了!

(1)增—增加最后一个元素

// 增---在root下面加一个节点
@Test
public void add() throws DocumentException, Exception {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");
    Element root = dom.getRootElement();
    // 添加节点
    Element eHncu = root.addElement("hncu");
    eHncu.addAttribute("id", "0737");
    Element eName = eHncu.addElement("name");
    eName.addText("湖南城市学院");
    Element eAge = eHncu.addElement("age");
    eAge.addText("15");

    // ////////////////////以下演示保存//////////////////////////////
    // 保存----持久化----字符流要刷流
    //1:简易方式-----直接通过Document中的一个writer(writer w)来实现
    /*
     * FileWriter fw=new FileWriter("./xml/users.xml/"); dom.write(fw);
     * fw.close();
     */
    //2:普通方式-----通过XMLwriter中的一个writer(dom)
    /*
     * 2.1用 构造 XMLWriter(OutputStream) XMLWriter xw=new XMLWriter(new
     * FileOutputStream("./xml/users.xml")); xw.write(dom); xw.close();
     */
    /*
     * 2.2用 构造XMLWriter(Writer writer) XMLWriter xw=new XMLWriter(new
     * FileWriter("./xml/users.xml/")); xw.write(dom); xw.close();
     */
    /*
     * 2.3用 构造 XMLWriter(Writer w,OutputFormat
     * format)----以制定的格式输出,可以解决中文乱码问题 OutputFormat
     * format=OutputFormat.createPrettyPrint(); XMLWriter xw=new
     * XMLWriter(new FileOutputStream("./xml/users.xml/"), format);
     * xw.write(dom); xw.close();
     */
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml/"),
            format);
    xw.write(dom);
    xw.close();
}

(1-1)dom4j保存dom树

// ////////////////////以下演示保存//////////////////////////////
    // 保存----持久化----字符流要刷流
    //1:简易方式-----直接通过Document中的一个writer(writer w)来实现
    /*
     * FileWriter fw=new FileWriter("./xml/users.xml/"); dom.write(fw);
     * fw.close();
     */
    //2:普通方式-----通过XMLwriter中的一个writer(dom)
    /*
     * 2.1用 构造 XMLWriter(OutputStream) XMLWriter xw=new XMLWriter(new
     * FileOutputStream("./xml/users.xml")); xw.write(dom); xw.close();
     */
    /*
     * 2.2用 构造XMLWriter(Writer writer) XMLWriter xw=new XMLWriter(new
     * FileWriter("./xml/users.xml/")); xw.write(dom); xw.close();
     */
    /*
     * 2.3用 构造 XMLWriter(Writer w,OutputFormat
     * format)----以制定的格式输出,可以解决中文乱码问题 OutputFormat
     * format=OutputFormat.createPrettyPrint(); XMLWriter xw=new
     * XMLWriter(new FileOutputStream("./xml/users.xml/"), format);
     * xw.write(dom); xw.close();
     */

(2)删—删除最后一个元素

// 删----删除最后一个元素
@Test
public void del() throws DocumentException, IOException {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");
    Element root = dom.getRootElement();
    List list = root.elements();
    Element e = list.get(list.size() - 1);
    e.getParent().remove(e);
    // 保存
    XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml"));
    xw.write(dom);
    xw.close();
}

(3)改—-修改最后一个元素

// 改----修改最后一个元素
@Test
public void update() throws Exception {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");
    Element root=dom.getRootElement();
    List list=root.elements();
    Element eLast =list.get(list.size()-1);
    eLast.addAttribute("id", "0777");
    eLast.element("name").setText("湖南城市大学");
    eLast.element("age").setText("1200");
    XMLWriter xw=new XMLWriter(new FileOutputStream("./xml/users.xml"));
    xw.write(dom);
    xw.close();

}

(4)查—-遍历所有的

// 查---遍历所有的
@Test
public void queryAll() throws DocumentException {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml/");
    Element root = dom.getRootElement();
    Iterator it = root.elementIterator();
    while (it.hasNext()) {
        Element eUser = it.next();
        String id = eUser.attributeValue("id");
        String name = eUser.elementText("name");
        String age = eUser.elementText("age");
        System.out.println(id + "," + name + "," + age);
    }
}

利用DOM4J创建一个新的XML文档:

// 无中生有-----利用程序创建一个新的XML文档
@Test
public void createNewXml() throws Exception {
    // 核心代码:创建出DOM即可
    Document dom = DocumentHelper.createDocument();
    Element root = dom.addElement("students");
    Element eStud=root.addElement("stud");
    eStud.addAttribute("id", "1406101-12");
    eStud.addElement("name").setText("Jack");
    eStud.addElement("age").setText("22");

    //保存
    XMLWriter xw=new XMLWriter(new FileWriter("./xml/students.xml/"));
    xw.write(dom);
    xw.close();
}

创建后的新xml文档:


<students>
    <stud id="1406101-12">
        <name>Jackname>
        <age>22age>
    stud>
students>

你可能感兴趣的:(❸JavaEE,----,----DOM4J,----,----⑥XML文档解析技术)