dom4j解析xml

xml

xml解析技术介绍

xml可扩展的标记性语言

  • 不管是html文件还是xml文件,它们都是标记性文档,都可以使用w3c组织制定的 dom 技术进行解析

DOM技术

  1. 早期JDK为我们提供了两种xml解析技术Dom和Sax:
    1) dom解析技术是w3c组织制定的,而所有的编程语言都对这个解析技术使用了自己的特点进行实现
    2) sun公司在JDK5版本对dom解析技术进行升级:Sax(Simple API for xml)
  2. 第三方解析:
    1) jdom在dom基础上进行了封装
    2) dom4j又对jdom进行了封装
    3) pull主要用在Android手机开发上,是跟sax非常类似,都是事件机制解析xml文件
  • 紧接着会介绍使用dom4j来解析xml文件

dom4j读取xml

1. 新建一个工程,目录如下:新建工程目录
2. 在src目录下新建一个xml文件,以及一个Book的Java类

books.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<books>
   <book sn="2022042001">
       <name>生死疲劳</name>
       <author>莫言</author>
       <price>99.9</price>
   </book>
   <book sn="2022042002">
       <name>丰乳肥臀</name>
       <author>莫言</author>
       <price>88.8</price>
   </book>
</books>

Book.java:

package com.ldyr;

import java.math.BigDecimal;

public class Book {
    private Integer sn;
    private String name;
    private String author;
    private BigDecimal price;

    public Book() {
    }

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

    public Integer getSn() {
        return sn;
    }

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

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

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

    public BigDecimal getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "Book{" +
                "sn=" + sn +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}
3. 接下来就要使用 dom4j 将 books.xml 文件的内容,里面的每一个 book 都解析成为 Book.java 类中的一个对象实例
4. 在lib目录下添加 dom4j 需要的jar包,以及测试需要的jar包添加jar包
5. 如何使用dom4j读取xml文件?

1)在src目录下新建一个Dom4jTest.java类,进行测试,可以打开在dom4j官网下载的jar包中的index.html文件,目录如下index文件位置
2)打开后出现以下页面index文件页面
3)根据Quck Start中的提示一步一步操作,进行最简单的dom4j解析xml文件
快速dom4j解析xml
4)实际操作代码及结果

/**
    * 读取xml文件,生成Document对象
    * @throws DocumentException
    */
    @Test
   public void test1() throws DocumentException {
       // 创建一个SaxReader输入流,去读取xml配置文件,生成Document对象
       SAXReader saxReader = new SAXReader();
       Document document = saxReader.read("src/books.xml");

       // 控制台打印,判断是否得到books对象
       System.out.println(document);
   }

控制台打印结果显示如下,表面已经可以使用dom4j读取books.xml文件了
控制台结果

6. 上面的测试1中,我们已经能够读取books.xml文件了,现在写上另一个测试test2,实现读取books.xml文件生成Book类

1)创建一个SaxReader输入流,去读取xml配置文件,生成Document对象

	/**
     * 读取books.xml,生成Book类
     */
	@Test
	public void test2() {		
			// 1.创建一个SaxReader输入流,去读取xml配置文件,生成Document对象
			SAXReader saxReader = new SAXReader();
            Document doc = saxReader.read("src/books.xml");
    }

这里的打印结果第5步已经给出,这里不在展示

2)通过Document对象,获取根元素

	/**
     * 读取books.xml,生成Book类
     */
	@Test
	public void test2() {		
			// 2.通过Document对象,获取根元素
			Element rootElement = doc.getRootElement();
            System.out.println(rootElement);
    }

这里将获取到的根元素,在控制台打印出来,如图所示
根元素
3)根据根元素 ,获取books.xml标签对象
其中要用到的知识点有:
i.element()和elements()都是根据标签名查询子元素,有多个子元素要查的时候选择后面的
ii…asXML()可以将标签对象,转化为标签字符串

	/**
     * 读取books.xml,生成Book类
     */
	@Test
	public void test2() {		
			// 3.根据根元素 ,获取books.xml标签对象
			// element()和elements()都是根据标签名查询子元素,有多个子元素要查的时候选择后面的
			List<Element> books = rootElement.elements("book");
            for (Element book : books) {
                // asXML()将标签对象,转化为标签字符串
                System.out.println(book.asXML());
            }
    }

这里将获取到的标签对象打印到控制看看
获取到的标签对象
看上图控制台中的结果,正式我们在books.xml文件的books根元素中,编写的内容。

  • 注意:根据根元素 ,获取books.xml标签对象时,可以使用asXML(),将标签对象转化为标签字符串,
    不然我们只能获取到以下的内容,只能判断出根元素中有两个对象,但不知道具体内容

不使用asXML后结果
4)遍历,处理每个books标签转换为Book类
知识点:
i. .elementText():直接获取标签元素中的内容
ii. .attributeValue():直接获取标签元素的属性值

```java
	/**
     * 读取books.xml,生成Book类
     */
	@Test
	public void test2() {	
			// 3.根据根元素 ,获取books.xml标签对象
            // element()和elements()都是根据标签名查询子元素,有多个子元素要查的时候选择后面的	
			// 4.遍历,处理每个books标签转换为Book类
            for (Element book : books) {
                // asXML()将标签对象,转化为标签字符串
                // System.out.println(book.asXML());
                String name = book.elementText("name");
                String author = book.elementText("author");
                String price = book.elementText("price");
                String sn = book.attributeValue("sn");
                Book BookObj = new Book(Integer.parseInt(sn), name, author, Double.parseDouble(price));
                System.out.println(BookObj);
            }
    }

控制台的结果如下,已经将books.xml转化为Book对象了
Book类

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值