XML简介
定义:是一门可拓展
的标记性语言
作用:
- 用来保存数据,而且这些数据具有自我描述性
- 可以作为项目或者模块的配置文件
- 作为网络传输数据的格式(现在以JSON为主)
XML解析技术
xml是可扩展的标记语言。不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。
XML文档对象模型定义访问和操作XML文档的标准方法。DOM将XML文档作为一个树形结构,而其树叶被定义为结点
document对象表示的是整个文档(可以是html文档,也可以是xml文档)
早期JDK为我们提供了两种xml解析技术Dom和Sax(已过时)
dom解析技术是w3c组织制定的。而所有编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析标记也做了实现。sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)qi跟W3C制定的解析不太一样。它是以类似世家机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取xml文件进行解析的。不会创建大量的dom对象。所以其在解析xml的时候,在内存使用和性能上都优于DOM解析
此外,还有一些第三方解析:
- jdom在dom基础上进行了封装
- dom4j又对jdom进行了封装
- pull主要用在Android手机开发,跟sax非常类似,都是事件机制解析xml文件
这个Dom4j是第三方解析技术,我们需要使用第三方给我们提供更好的类库才可以解析xml文件
XML语法
XML元素(标签)必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符"xml"(或XML、Xml等)开始(xml的大小写敏感)
- 名称不能包含空格
- 所有xml属性都必须有关闭标签(闭合)
- xml文档必须有根元素(顶级元素,没有父标签且只有一个的元素)
- 标签可以为双标签,也可以是单标签
- 文本区域(CDATA区):告诉xml解析器,该区域内部的的文本内容只是纯文本,不需要xml语法解析
<!--CDATA格式-->
<![CDATA[此处为纯文本内容,不需要解析]]>
XML属性
xml的标签属性和html的标签属性非常类似,属性可以提供元素的额外信息
。在标签上可以书写属性:一个标签可以书写多个属性,每个属性的值必须使用引号引起来,其规则和标签的书写规则一致。
dom4j解析技术(重点)
Dom4j类库的使用
官方下载链接:https://dom4j.github.io/(初学建议下载1.6的zip文件,防止不兼容问题发生,方便后续操作)
docs是文档目录
查找dom4j文档
Dom4j快速入门
lib目录
src目录是第三方类库的源码目录
dom4j编程步骤
第一步: 先加载 xml 文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作
第五步,保存到硬盘上
获取document对象
创建一个 lib 目录,并添加 dom4j 的 jar 包。并添加到类路径。
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book sn="SN123214212">
<name>西游记</name>
<price>49.9</price>
<author>吴承恩</author>
</book>
<book sn="SN52661728">
<name>红楼梦</name>
<price>53.8</price>
<author>曹雪芹</author>
</book>
</books>
此外,还需要两个jar包:
- junit-4.12.jar https://nowjava.com/jar/detail/m03049792/junit-4.12.jar.html
- hamcrest-core-1.3.jar https://nowjava.com/jar/detail/m04603470/hamcrest-core-1.3.jar.html
创建一个book类
import java.math.BigDecimal;
/**
* @BelongsProject: JavaWeb
* @BelongsPackage: Book
* @Author: HeXin
* @CreateTime: 2023/1/27 10:01
* @Description:
* @Version: 1.0
*/
public class Book {
private String sn;
private String name;
private BigDecimal price;
private String author;
public String getSn () {
return sn;
}
public void setSn (String sn) {
this.sn = sn;
}
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
public BigDecimal getPrice () {
return price;
}
public void setPrice (BigDecimal price) {
this.price = price;
}
public String getAuthor () {
return author;
}
public void setAuthor (String author) {
this.author = author;
}
@Override
public String toString () {
return "Book{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", price=" + price +
", author='" + author + '\'' +
'}';
}
public Book (String sn, String name, BigDecimal price, String author) {
this.sn = sn;
this.name = name;
this.price = price;
this.author = author;
}
public Book () {
}
}
创建DOM4jTest测试类
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.List;
/**
* @BelongsProject: JavaWeb
* @BelongsPackage: DOM4jTest
* @Author: HeXin
* @CreateTime: 2023/1/27 23:13
* @Description:
* @Version: 1.0
*/
public class DOM4jTest {
@Test
public void test1(){
//创建一个SAXReader输入流,读取xml配置文件,生成document对象
SAXReader saxReader = new SAXReader();
Document read = null;
try {
read = saxReader.read("src/books.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
System.out.println(read);
}
@Test
/**
* @Description:读取books.xml文件生成Book类
* @CreateTime:2023/1/28 8:39
* @Author:HeXin
*
*/
public void test2(){
//1.读取books.xml文件
SAXReader reader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始
Document document = null;
try {
document = reader.read("src/books.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
//2.通过Document对象获取根元素
Element root = document.getRootElement();
//3.通过根元素获取book标签对象
List<Element> books = root.elements("book");
//4.遍历,处理每个book标签转换为Book类
for(Element book : books){
//asXML()把标签对象转换为标签字符串
Element nameElement = book.element("name");
//getText():可以获取标签中的文本内容
String name = nameElement.getText();
//直接获取指定标签名的文本内容
String price = book.elementText("price");
String author = book.elementText("author");
String sn = book.attributeValue("sn");//获取属性值
System.out.println(new Book(sn,name, BigDecimal.valueOf(Double.parseDouble(price)),author));
}
}
}