xml
xml解析技术介绍
xml可扩展的标记性语言
- 不管是html文件还是xml文件,它们都是标记性文档,都可以使用w3c组织制定的 dom 技术进行解析
- 早期JDK为我们提供了两种xml解析技术Dom和Sax:
1) dom解析技术是w3c组织制定的,而所有的编程语言都对这个解析技术使用了自己的特点进行实现
2) sun公司在JDK5版本对dom解析技术进行升级:Sax(Simple API for xml) - 第三方解析:
1) jdom在dom基础上进行了封装
2) dom4j又对jdom进行了封装
3) pull主要用在Android手机开发上,是跟sax非常类似,都是事件机制解析xml文件
- 紧接着会介绍使用dom4j来解析xml文件
dom4j读取xml
1. 新建一个工程,目录如下:![新建工程目录](https://img-blog.csdnimg.cn/22a2f6bf04b04e5f817d4d85b27333cb.png)
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包](https://img-blog.csdnimg.cn/83914bff2e5f460d8d87d294205e62c8.png)
5. 如何使用dom4j读取xml文件?
1)在src目录下新建一个Dom4jTest.java类,进行测试,可以打开在dom4j官网下载的jar包中的index.html文件,目录如下
2)打开后出现以下页面
3)根据Quck Start中的提示一步一步操作,进行最简单的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(),将标签对象转化为标签字符串,
不然我们只能获取到以下的内容,只能判断出根元素中有两个对象,但不知道具体内容
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对象了