1. 概述
1.1. 引言
首先,我们来认识一下,什么是XML?
XML是可扩展的标记语言( Extensible Markup Language ),意思是它是由一些标签组成的,而这些标签是自己定义的。本质上是一种数据格式,可以用来表示复杂的数据关系。
XML文件有如下的特点:
- XML中的
<标签名>
称为一个标签或者一个元素,一般是成对出现的。 - XML中的标签名可以自己定义(可扩展),但是必须要正确的嵌套
- XML中只能有一个根标签。
- XML标准中可以有属性
- XML必须第一行有一个文档声明,格式是固定的
<?xml version="1.0" encoding="UTF-8"?>
- XML文件必须是以.xml为后缀结尾
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!-- 根标签只能有一个 -->
<users>
<user id="1" desc="第一个用户">
<name>张无忌</name>
<sex>男</sex>
<地址>光明顶</地址>
<password>minmin</password>
</user>
<people>很多人</people>
<user id="2">
<name>敏敏</name>
<sex>女</sex>
<地址>光明顶</地址>
<password>wuji</password>
</user>
</users>
上面XML文件中的数据格式是最为常见的,标签有属性、文本、还有合理的嵌套。XML文件中除了写以上的数据格式之外,还有一些特殊的字符不能直接写。
那么,XML在实际开发中有什么作用?
- 1 传输数据
- 2 作为一些框架的配置信息文件 比如logback.xml
1.2. 处理特殊符号
-
像
<,>,&
等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。如果标签文本中有这些特殊字符,需要用一些
占位符
代替。< 表示 < > 表示 > & 表示 & ' 表示 ' " 表示 "
3 < 2 && 5 > 4
-
如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用
CDATA区
,格式如下- idea快捷提示是 CD
4 ]]>
2. XML解析
2.1. 概念
所谓的xml解析,就是从xml中获取到数据
-
常见的解析思想
DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。
会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值 -
常见的解析工具
- JAXP: SUN公司提供的一套XML的解析的API
- JDOM: 开源组织提供了一套XML的解析的API-jdom
- DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java,目前使用最多的
- Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)
-
解析的准备工作
-
我们可以通过网站:https://dom4j.github.io/ 去下载dom4j
今天的资料中已经提供,我们不用再单独下载了,直接使用即可
-
将提供好的dom4j-1.6.1.zip解压,找到里面的dom4j-1.6.1.jar
-
在idea中当前模块下新建一个lib文件夹,将jar包复制到文件夹中
-
选中jar包 -> 右键 -> 选择add as library即可
-
-
DOM4j的API介绍
解析过程中必须记住的几个单词:Document文档 Element标签 Attribute属性
- SaxReader对象
返回值 方法名 说明 SAXReader new SAXReader() 构造器 Document 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() 获得当前元素的文本内容
2.2. 案例
2.2.1. 需求
- 解析提供好的xml文件
- 将解析到的数据封装到学生对象中
- 并将学生对象存储到ArrayList集合中
- 遍历集合
2.2.2. 代码
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students>
<!--第一个学生信息-->
<student id="1">
<name>张三</name>
<age>23</age>
</student>
<!--第二个学生信息-->
<student id="2">
<name>李四</name>
<age>24</age>
</student>
</students>
实体类
@Data
public class Student {
private String id;
private String name;
private int age;
}
业务方法
/**
* 利用dom4j解析xml文件
*/
import org.dom4j.Attribute;
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 {
SAXReader reader = new SAXReader();
// 1加载文件 获取文档document对象
Document document = reader.read("mymodule/stus.xml");
// 2获取根标签
Element root = document.getRootElement();
// 3获取根标签的子标签
List<Element> elements = root.elements();
ArrayList<Student> stus = new ArrayList<>();
for (Element element : elements) {
//element是每一个子元素
// System.out.println(element);
//获取属性Attribute对象
// Attribute idattribute = element.attribute("id");
//23
// System.out.println(idattribute.getValue());
//直接获取属性id的值
String id = element.attributeValue("id");
//先获取标签对象 再获取文本
// Element nameElement = element.element("name");
// System.out.println(nameElement.getText());
//直接获取标签文本
String name = element.elementText("name");
String age = element.elementText("age");
//封装为学生对象
stus.add(new Student(id, name, Integer.parseInt(age)));
}
}
}
3. XML约束
3.1. 概述
首先,什么是XML约束?
XML约束指的是限制XML文件中的标签或者属性,只能按照规定的格式写。
比如我在项目中,想约束一个XML文件中的标签只能写<书>、<书名>、<作者>、<售价>这几个标签,如果写其他标签就报错。
3.2. 实现方案
怎么才能达到上面的效果呢?有两种约束技术,一种是DTD约束、一种是Schame约束。
DTD约束案例
如下图所示book.xml中引入了DTD约束文件,book.xml文件中的标签就受到DTD文件
的约束
DTD文件解释
表示根标签是<书架>,并且书架中有子标签<书>
表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
表示<书名>是一个标签,且<书名>里面是普通文本
表示<作者>是一个标签,且<作者>里面是普通文本
表示<售价>是一个标签,且<售价>里面是普通文本
Schame约束案例
如下图所示,左边的book2.xml文件就受到右边schame文件(.xsd结尾的文件)
的约束。
- 在一些框架中,框架会给出如何引入约束,我们需要引入然后按规则写xml
Comments NOTHING