【Java】Java核心 75:XML解析 Dom4j (上) 您所在的位置:网站首页 dom4j获取节点的方法 【Java】Java核心 75:XML解析 Dom4j (上)

【Java】Java核心 75:XML解析 Dom4j (上)

2023-07-07 02:09| 来源: 网络整理| 查看: 265

文章目录 1 XML解析1.1 解析概述1.2 解析方式和解析器 2 Dom4j的基本使用2.1 DOM解析原理及结构模型2.2 常用的方法SAXReader对象Document对象Element对象 2.3 方法演示

在这里插入图片描述

1 XML解析 1.1 解析概述

当将数据存储在XML后,我们就希望通过程序获取XML的内容。我们使用Java基础所学的IO知识是可以完成的,不过需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。

人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。

1.2 解析方式和解析器

开发中比较常见的解析方式有三种,如下:

DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象

a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b)缺点:XML文档过大,可能出现内存溢出

SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件。

a)优点:处理速度快,可以处理大文件

b)缺点:只能读,逐行后将释放资源,解析操作繁琐。

PULL:Android内置的XML解析方式,类似SAX。(了解)

解析器,就是根据不同的解析方式提供具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包

在这里插入图片描述

常见的解析器

在这里插入图片描述

2 Dom4j的基本使用 2.1 DOM解析原理及结构模型

解析原理

将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM树进行操作。以下面books.xml文档为例。

JavaWeb开发教程 张孝祥 100.00元 三国演义 罗贯中 100.00元

结构模型

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中。

在这里插入图片描述

结论:使用Document对象,就可以去访问DOM树中的每一个节点

引入dom4j的jar包

去官网下载 zip 包。http://www.dom4j.org/

通常我们会在项目中创建lib文件夹,将需要依赖的库放在这里。

库导入方式:

在IDEA中,选择项目鼠标右键—>弹出菜单–>open Module settings”–>Dependencies–>±->JARs or directories… 找到dom4j-1.6.1.jar,成功添加之后点击"OK" 即可。

直接右键选择:Add as Library

在这里插入图片描述

2.2 常用的方法

dom4j 必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。

SAXReader对象 方法作用SAXReader sr = new SAXReader();构造器Document read(String url)加载执行xml文档 Document对象 方法作用Element getRootElement()获得根元素 Element对象 方法作用List elements(String ele )获得指定名称的所有子元素。可以不指定名称Element element(String ele)获得指定名称第一个子元素。String getName()获得当前元素的元素名String attributeValue(String attrName)获得指定属性名的属性值String elementText(Sting ele)获得指定名称子元素的文本值String getText()获得当前元素的文本内容

小结

解析xml的步骤:

创建SaxReader对象,调用read方法关联xml文件,得到一个Document对象通过Document对象,获取根元素获取根元素之后,就可以层层深剥,运用Element相关的API进行解析其子元素 2.3 方法演示

复制资料下的常用xml中"books.xml",内容如下:

JavaWeb开发教程 张孝祥 100.00元 三国演义 罗贯中 100.00元

注意:为了便于解析,此xml中没有添加约束

解析此文件,获取每本书的id值,以及书本名称,作者名称和价格.

步骤分析:

创建一个SaxReader对象,调用read方法加载一个xml文件获得文档对象通过文档对象,获取根元素通过根元素一层一层的进行解析子元素。 import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.List; public class Demo01 { public static void main(String[] args) throws DocumentException { //1. 创建一个SaxReader对象,调用read方法加载一个xml文件获得文档对象 SAXReader sr = new SAXReader(); Document doc = sr.read("day15/xml/book.xml"); //2. 通过文档对象,获取根元素 Element rootElement = doc.getRootElement(); //3. 通过根元素一层一层的进行解析子元素。 //获取所有的子元素 List bookElements = rootElement.elements("book"); for (Element bookElement : bookElements) { //System.out.println(bookElement); //解析属性 String id = bookElement.attributeValue("id"); System.out.println("id = " + id); //获取子元素文本 String name = bookElement.elementText("name"); String author = bookElement.elementText("author"); String sale = bookElement.elementText("sale"); System.out.println("name = " + name); System.out.println("author = " + author); System.out.println("sale = " + sale); System.out.println("----------------------"); } } }

需求二:

将xml中文件数据解析成为java对象,每个book解析为一个book类型的对象。然后将book对象放到一个集合中存储。

JavaWeb开发教程 张孝祥 100.00元 三国演义 罗贯中 100.00元

步骤分析:

先创建一个Book类对应book元素创建一个ArrayList集合用来存储解析后的book对象创建SaxReader对象,调用read方法加载xml文件,得到文档对象通过文档对象获取根元素,然后层层解析

代码实现:

public class Demo02 { public static void main(String[] args) throws DocumentException { //定义一个集合用来存储解析的Book对象 ArrayList books = new ArrayList(); //1. 创建一个SaxReader对象,调用read方法加载一个xml文件获得文档对象 SAXReader sr = new SAXReader(); Document doc = sr.read("day15/xml/book.xml"); //2. 通过文档对象,获取根元素 Element rootElement = doc.getRootElement(); //3. 通过根元素一层一层的进行解析子元素。 //获取所有的子元素 List bookElements = rootElement.elements("book"); for (Element bookElement : bookElements) { //System.out.println(bookElement); //解析属性 String id = bookElement.attributeValue("id"); System.out.println("id = " + id); //获取子元素文本 String name = bookElement.elementText("name"); String author = bookElement.elementText("author"); String sale = bookElement.elementText("sale"); //将解析的字符串封装成为对象,放到集合 Book book = new Book(id,name,author,sale); books.add(book); } //将集合遍历,打印book对象 for (Book book : books) { System.out.println("book = " + book); } } } class Book{ private String id; private String name; private String author; private String sale; public Book() { } public Book(String id, String name, String author, String sale) { this.id = id; this.name = name; this.author = author; this.sale = sale; } public String getId() { return id; } public void setId(String id) { this.id = id; } 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 String getSale() { return sale; } public void setSale(String sale) { this.sale = sale; } @Override public String toString() { return "Book{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", author='" + author + '\'' + ", sale='" + sale + '\'' + '}'; } }

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有