一、XML解析技术概述
(1)XML的数据的作用是什么,最终需要怎么处理?
- 存储数据、做配置信息、进行数据传输。
- 最终需要被程序进行读取,解析里面的信息。
(2)什么是XML解析
- 使用程序读取XML中的数据
(3)两种解析方式
- SAX解析
- DOM解析
(4)Dom常见的解析工具
名称 | 说明 |
---|---|
JAXP | SUN公司提供的一套XML的解析的API |
JDOM | JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 |
dom4j | 是JDOM的升级品,用来读写XML文件的。具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom 技术,同时它也是一个开放源代码的软件,Hibernate也用它来读写配置文件。 |
jsoup | 功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便 |
(5)DOM解析解析文档对象模型
(6)Dom解析常用技术框架
- Dom4J
二、Dom4J解析XML文件
(1)案例:使用Dom4J解析出XML文件
需求
- 使用Dom4J把一个XML文件的数据进行解析
分析
①下载Dom4j框架,官网下载。
②在项目中创建一个文件夹:lib
③将dom4j-2.1.1.jar文件复制到 lib 文件夹
④在jar文件上点右键,选择 Add as Library -> 点击OK
⑤在类中导包使用
导入Dom4j框架
①下载Dom4j框架,官网下载。
-
搜索dom4j,进入官网下载
-
下载并解压之后如下
-
双击index.html,就可以看到dom4j的API,方便使用
②在项目中创建一个文件夹:lib
③将dom4j-2.1.1.jar文件复制到 lib 文件夹 -
复制dom4j-2.1.1.jar文件
-
将dom4j-2.1.1.jar文件复制到 lib 文件夹
④在jar文件上点右键,选择 添加到库 -> 点击确定
⑤在类中导包使用
(2)Dom4j解析XML-得到Document对象
①SAXReader类
构造器/方法 | 说明 |
---|---|
public SAXReader() | 创建Dom4J的解析器对象 |
Document read(String url) | 加载XML文件成为Document对象 |
②Document类
方法名 | 说明 |
---|---|
Element getRootElement() | 获得根元素对象 |
三、Dom4J解析XML文件中的各种节点
(1)Dom4j解析XML的元素、属性、文本
方法名 | 说明 |
---|---|
List elements() | 得到当前元素下所有子元素 |
List elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
Element element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
String getName() | 得到元素名字 |
String attributeValue(String name) | 通过属性名直接得到属性值 |
String elementText(子元素名) | 得到指定名称的子元素的文本 |
String getText() | 得到文本 |
(2)具体实现
/**
目标:学会使用dom4j解析XML文件中的数据。
1、导入dom4j框架。
2、准备一个XML文件。
*/
public class Dom4JHelloWorldDemo1 {
@Test
public void parseXMLData() throws Exception {
// 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
SAXReader saxReader = new SAXReader();
// 2、把XML文件加载到内存中成为一个Document文档对象
// Document document = saxReader.read(new File("SummerTryTest2\\src\\Contacts.xml")); // 需要通过模块名去定位
// Document document = saxReader.read(new FileInputStream("SummerTryTest2\\src\\Contacts.xml"));
// 注意: getResourceAsStream中的/是直接去src下寻找的文件
InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
Document document = saxReader.read(is);
// 3、获取根元素对象
System.out.println("-----------------------获取根元素对象------------------------");
Element root = document.getRootElement();
System.out.println(root.getName());
// 4、拿根元素下的全部子元素对象(一级)
System.out.println("-------------------拿根元素下的全部子元素对象-------------------");
List<Element> sonEles = root.elements();
for (Element sonEle : sonEles) {
System.out.println(sonEle.getName());
}
System.out.println("---------------根据名称拿根元素下的全部子元素对象-----------------");
List<Element> sonEles2 = root.elements("contact");
for (Element sonEle : sonEles2) {
System.out.println(sonEle.getName());
}
System.out.println("-----------------------拿某个子元素-------------------------");
// 拿某个子元素
Element userEle = root.element("user");
System.out.println(userEle.getName());
System.out.println("----------------------------------------------------------");
// 默认提取第一个子元素对象 (Java语言。)
Element contact = root.element("contact");
// 获取子元素文本
System.out.println(contact.elementText("name"));
// 去掉前后空格
System.out.println(contact.elementTextTrim("name"));
// 获取当前元素下的子元素对象
Element email = contact.element("email");
System.out.println(email.getText());
// 去掉前后空格
System.out.println(email.getTextTrim());
// 根据元素获取属性值
Attribute idAttr = contact.attribute("id");
System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
// 直接提取属性值
System.out.println(contact.attributeValue("id"));
System.out.println(contact.attributeValue("vip"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
<contact id="1" vip="true">
<name> 潘金莲 </name>
<gender>女</gender>
<email>panpan@itcast.cn</email>
</contact>
<contact id="2" vip="false">
<name>武松</name>
<gender>男</gender>
<email>wusong@itcast.cn</email>
</contact>
<contact id="3" vip="false">
<name>武大狼</name>
<gender>男</gender>
<email>wuda@itcast.cn</email>
</contact>
<user>
</user>
</contactList>
(3)Dom4J的解析思想
- 得到文档对象Document,从中获取元素对象和内容。
四、Dom4J解析XML文件-案例实战
(1)XML解析案例
- 需求:利用Dom4J的知识,将Contact.xml文件中的联系人数据封装成List集合,其中每个元素是实体类Contact。打印输出 List 中的每个元素。
(2)具体实现
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
<contact id="1" vip="true">
<name> 潘金莲 </name>
<gender>女</gender>
<email>123456@qq.com</email>
</contact>
<contact id="2" vip="false">
<name>武松</name>
<gender>男</gender>
<email>789123@qq.com</email>
</contact>
<contact id="3" vip="false">
<name>武大郎</name>
<gender>男</gender>
<email>147258@qq.com</email>
</contact>
<user>
</user>
</contactList>
/**
* <contact id="1" vip="true">
* <name> 潘金莲 </name>
* <gender>女</gender>
* <email>panpan@itcast.cn</email>
* </contact>
*/
public class Contact {
private String name;
private int id;
private boolean vip;
private char gender;
public Contact() {
}
public Contact(String name, int id, boolean vip, char gendar, String email) {
this.name = name;
this.id = id;
this.vip = vip;
this.gender = gendar;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isVip() {
return vip;
}
public void setVip(boolean vip) {
this.vip = vip;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
private String email;
@Override
public String toString() {
return "Contact{" +
"name='" + name + '\'' +
", id=" + id +
", vip=" + vip +
", gender=" + gender +
", email='" + email + '\'' +
'}';
}
}
public class Dom4JTest {
@Test
public void parseTOList() throws Exception {
// 需求:解析XML中的数据成为一个List集合对象
// 1.导入dom4j框架(已经完成啦)
// 2.创建SaxReader对象
SAXReader saxReader = new SAXReader();
// 3.加载XML文件成为文档对象Document对象
Document document = saxReader.read(Dom4JTest.class.getResourceAsStream("/Contacts.xml"));
// 4.先拿根元素
Element root = document.getRootElement();
// 5.提取contact子元素
List<Element> contactEles = root.elements("contact");
// 6.准备一个ArrayList集合封装联系人信息
List<Contact> contacts = new ArrayList<>();
// 7.遍历Contact子元素
for (Element contactEle : contactEles) {
// 8.每个子元素都是一个联系人对象
Contact contact = new Contact();
contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
contact.setName(contactEle.elementTextTrim("name"));
contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
contact.setEmail(contactEle.elementTextTrim("email"));
// 9.把联系人对象数据加入到List集合
contacts.add(contact);
}
// 10.遍历List集合
for (Contact contact : contacts) {
System.out.println(contact.toString());
}
}
}
(3)Dom4J的解析后的数据形式。
通常数据会封装成Java的对象,如单个对象,或者集合对象形式