Dom4j解析Xml文档

2020-07-11   268 次阅读


xml解析技术介绍

xml可扩展的标记语言。
不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。

早期JDK为我们提供了两种xml解析技术DOM和Sax简介(已经过时,但我们需要知道这两种技术)

  • dom解析技术

dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。

Java对dom技术解析标记也做了实现。

sun公司在JDK5版本对dom解析技术进行升级:

  • SAX ( Simple API for XML )解析

SAX解析,它跟W3C制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取xml文件进行解析的。不会创建大量的dom对象。
所以它在解析xml的时候,在内存的使用上和性能上,都优于Dom解析。

第三方的解析:

jdom在dom基础上进行了封装、dom4j又对jdom进行了封装。

pull主要用在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件。

Dom4j是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析xml文件。

dom4j解析技术(重点)

由于dom4j它不是sun公司的技术,而属于第三方公司的技术,我们需要使用dom4j就需要到dom4j官网下载dom4j的jar包

github开源地址:https://dom4j.github.io/

dom4j编程步骤:

可参考https://dom4j.github.io/

首先将Dom4j相应的jar包添加到当前的类库中(过程省略)

第一步:先加载xml文件,创建Document对象
第二步:通过Document对象拿到根元素对象
第三步:通过根元素.elelemts(标签名);可以返回一个集合,这个集合里放着所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作
第五步:保存到硬盘上

book.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book sn="SN123456">
        <name>JavaWeb程序设计</name>
        <price>56</price>
        <author>黑马程序员</author>
    </book>
    <book sn="SN123456">
        <name>数据结构</name>
        <price>35</price>
        <author>严蔚敏</author>
    </book>
</books>

Book类

package com.notys.xml;

/**
 * Book类
 */
public class Book {

    private String sn;
    private String name;
    private String price;
    private String author;

    public Book() {
    }

    public Book(String sn, String name, String price, String author) {
        this.sn = sn;
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "sn='" + sn + '\'' +
                ", name='" + name + '\'' +
                ", price='" + price + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

Dom4jTest类

	package com.notys.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
/**
 *Dom4j测试
 */
public class Dom4jTest {
    @Test
    public void test1() throws Exception {
        //创建一个SaxReader输入流,去读取xml配置文件
        SAXReader saxReader = new SAXReader();
        //创建document对象
        Document document = saxReader.read("src/books.xml");

        System.out.println(document);

    }
    /**
     * 读取books.xml文件生成book类
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        //1、创建一个SaxReader输入流,去读取xml配置文件
        SAXReader saxReader = new SAXReader();
        //2、创建document对象
        Document document = saxReader.read("src/books.xml");
        //3、通过document对象获取根元素
        Element rootElement = document.getRootElement();
        //System.out.println(rootElement);
        //4、通过根元素获取book标签对象
        List<Element> books = rootElement.elements("book");
        //5、遍历,处理每个book标签转换为book类
        for (Element book:books){
            //asXML()把标签对象转换为标签字符串
            //System.out.println(book.asXML());

            Element nameElement = book.element("name");
            //System.out.println(nameElement.asXML());

            String nameText = nameElement.getText();
            //System.out.println(nameText);

            //直接获取指定标签名的文本内容
            String priceText = book.elementText("price");
            String authorText = book.elementText("author");
            //attributeValue获取属性值
            String snValue = book.attributeValue("sn");

            System.out.println(new Book(snValue,nameText,priceText,authorText));
        }

    }
}

运行结果

"C:\Program Files\Java\jdk1.8.0_251\bin\java.exe" ...
Book{sn='SN123456', name='JavaWeb程序设计', price='56', author='黑马程序员'}
Book{sn='SN123456', name='数据结构', price='35', author='严蔚敏'}

Process finished with exit code 0

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

隻言片語・於此匯聚!