Dom4j的概述和使用

一、Dom4j概述
概念:采用DOM方式来解析XML文件
二、 DOM解析原理及结构模型
XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。
2.1核心
由于DOM方式解析XML文档所有都是节点,所有节点又都被封装到Document对象中,所以解析的重点就是获取Document对象。
2.2 DOM树的组成元素

组成解释
Document文档对象:代表整个xml文档
Node节点
Element元素
Attribute属性
Text文本

三、获得Document对象
概述:一个XML文件加载到内存中时就会创建一个Document对象,该Document对象包含了XML中的所有节点内容,通过该对象就可以获得对应XML文件的所有内容。
1.xml文件准备
有如下xml文件:
这个students.xml文件必须放在src下


<?xml version="1.0" encoding="UTF-8"?>
<students><student id="1" excellent="true"><name>小红</name><sex></sex><phone>xiaomi7</phone></student><student id="2" excellent="false"><name>李四</name><sex></sex><phone>iphonex</phone></student><student id="3" excellent="false"><name>灰太狼</name><sex></sex><phone>xiaomi8</phone></student>
</students>

2.在得到文档对象之前必须导入dom4j-2.1.1.jar
步骤:

  1. 去官网下载 zip 包。http://www.dom4j.org/
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.1.jar文件复制到 lib 文件夹
  4. 在jar文件上点右键,选择 Add as Library -> 点击OK
  5. 在类中导包使用
    效果如图所示:
    在这里插入图片描述

3.得到Document文档对象
步骤:
文件students.xml放在src目录下

  1. 创建一个SAXReader对象,用于读取 xml 文件。
  2. 从类路径下加载xml文件,得到输入流对象
  3. 通过 SAXReader对象的read(InputStream in )方法,从输入流中读取,生成文档对象。

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;
/*** 使用 dom4j 解析工具读取 xml 文件*/
public class Demo1 {/*** 得到文档对象*/@Testpublic void getDocument() throws DocumentException {//创建SAXReader对象SAXReader reader = new SAXReader();//读取src目录下的文件,得到输入流InputStream in = Demo1.class.getResourceAsStream("/students.xml");//从输入流中得到文档对象Document document = reader.read(in);//打印documentSystem.out.println(document);

下面列举Element常用方法并用一个案例来使用其中大部分的方法

//    方法名	                                      功能说明
//    String getName()	                    得到标签的名字
//    Element element(name)	                获得指定名字的元素对象
//    List elements()	            获得当前元素下所有的子元素对象
//    List elements(name)	        获得当前元素下指定名字的所有子元素对象

Element中与属性相关方法

       //方法名	                                功能说明//Attribute attribute(name)	      根据属性名获得一个属性对象//String attributeValue(name)	  根据属性名获得属性值,返回字符串//List attributes()	  获得当前元素的所有属性对象,返回List集合

Attribute常用方法

//方法名	            功能说明
//String getName()	获得属性的名字
//String getValue()	获得属性的值结论:得到属性值的两种方式
1.	先得到Attribute对象,再通过对象的方法得到属性名和属性值
2.	直接通过属性的名字得到字符串类型的属性值。

Text文本元素
概述:
得到文本元素的前提:先得到元素Element,再得到元素下的文本
注意事项:
空格、换行、制表符:也是属于文本的一部分,所以在解析xml文件的时候,格式化XML文件要注意。
得到文本信息的方法:

//Element元素中的方法	             说明
//String getText()	             得到当前元素内部的文本
//String elementText(元素名)	     通过子元素名字得到子元素内部的文本
//String elementTextTrim(元素名)	 通过子元素名字得到子元素内部的文本,并且去掉前后的空格

案例演示:
利用 Dom4j 的知识,将 students.xml 文件中的学生数据封装成集合,其中每个元素是实体类 Student。打印输出 List 中的每个元素
1.xml文件用上面准备好的students.xml文件
2.实体类

//学生实体类
public class Student { private int id;private String name;private String sex;private String phone;//有参构造方法public Student(int id, String name, String sex, String phone) {this.id = id;this.name = name;this.sex = sex;this.phone = phone;}//无参构造方法public Student() {}// get set 方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}//重写toString@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", sex=" + sex +", phone='" + phone + '\'' +'}';}
}

测试类

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.util.ArrayList;
import java.util.List;public class Demo05 {public static void main(String[] args) throws DocumentException {List<Student> students = new ArrayList<>();//创建空集合存储学生对象SAXReader reader = new SAXReader();//获取文档对象Document read = reader.read(Demo05.class.getResourceAsStream("/students.xml"));Element rootElement = read.getRootElement();//获取根元素List<Element> elements = rootElement.elements();//得到所有标签(得到根元素下所有子元素)for (Element element : elements) {//遍历得到每个标签Student student = new Student();//创建学生对象int id = Integer.parseInt(element.attributeValue("id"));//获取标签中有id这个属性的值并且转换成int类型student.setId(id);//给对象中的id赋值String name = element.elementText("name");//获取标签中有name这个标签的文本值student.setName(name);//给对象中name赋值//获取所有标签中有sex这个标签的文本值String sex = element.elementText("sex");//给对象中sex赋值student.setSex(sex);//获取所有标签中有phone这个标签的文本内容String phone = element.elementText("phone");//给对象中phone赋值student.setPhone(phone);students.add(student);//把每次创建好并且赋值完毕的对象添加进list集合中}for (Student student : contacts) {//遍历list集合并且打印元素System.out.println(student);}}
}

运行main方法后的测试效果如图所示:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部