day17-xml解析与约束
一:XML配置文件
1.1 XML作为配置文件的优点
当需要运行多个文件的时候,properties配置文件需要在等号后面接着写,并用逗号进行分割,使用起来不方便,配置文件的可读性也不强,而XML配置文件就可以解决这一问题
1.2 XML配置文件概述
XML的全称为(EXtensible Markup Language)是一种可扩展的标记语言
标记语言:通过标签来描述数据的语言(标签我们有时候也称之为元素)
可扩展:标签的名字是可以自定义的
作用:
可以用于数据的存储和传输
作为软件的配置文件
1.3 XML标签的规则
- 标签有一对尖括号和合法的标识符组成
- 标签必须成对出现
- 有一些标签可以单独出现,但是必须要有结束标签
- 标签中可以定义属性,属性和标签名需要用空格隔开,属性值必须用引号引起来
- 标签必须要正确的嵌套
1.4 XML语法规则
XML文件的后缀名为:xml
文档声明必须是第一行第一列
- <? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
- version:该属性是必须存在的
- encoding:该属性不是必须的,表示打开当前XML文件应该使用什么编码表,一般是UTF-8;
- standalone:该属性不是必须的,该标签是描述当前的XML文件是否依赖与其他的XML文件,取值为yes/no
XML文件中可以定义注释信息
XML文件中可以存在以下的特殊字符,分号不能省
&it; -> 小于
>; -> 大于
&;-> 和号
&apos;-> 单引号
"; -> 引号
- XML文件中还可以存在CDATA区
<!【CDATA【…内容…】】>
1.5 DOM解析思想
DOM(Document Object Model):文档对象模型,就是把文档的各个组成部分看做对应的对象
会将xml文件全部加载到内存,在内存中形成一个树形结构,在获取对应的值
- Document对象:代表整个xml文档
- Element对象:代表所有标签
- Attribude对象:代表所有属性
- Test对象:所有文本内容
public static void main(String[] args) throws DocumentException {
// 1. 获取整个文档对象document;获取一个解析器对象
SAXReader saxReader = new SAXReader();
// 2. 利用这个解析器将xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new File("day18-code-XML\\xml\\student.xml"));
// 3. 获取根标签
Element rootElement = document.getRootElement();
// 4. 通过跟标签获取Student标签
// elements可以获取调用者所有的子标签,然后放入一个集合中返回
// List list = rootElement.elements();
// System.out.println(list.size());// 3
List<Element> studentElements = rootElement.elements("student");//获取指定所有的子标签
// 创建一个用来装封装好的学生对象
ArrayList<Student> list = new ArrayList<>();
// 5. 遍历集合得到每一个学生标签
for (Element element : studentElements) {
// 获取id这个属性
Attribute attribute = element.attribute("id");
// 获取id这个属性的值
String id = attribute.getValue();
// 获取name标签
// element参数是标签名:获取调用者的子标签
Element nameElement = element.element("name");
// 获取这个标签的标签体内容
String name = nameElement.getText();
// 获取age标签
Element ageElement = element.element("age");
String age = ageElement.getText();
// 封装为学生对象
Student student = new Student(id,name,Integer.parseInt(age));
list.add(student);
}
// 遍历这个ArrayList集合
for (Student student : list) {
System.out.println(student);
}
}
二:XML的约束
2.1 XML约束概述
XML的约束就是用来限定xml文件中可使用的标签以及属性
2.2 XML约束的分类
2.1.1 DTD约束技术
步骤
- 创建一个文件,这个文件名的后缀名为.dtd;
- 看xml文件中使用了哪些元素
- <!ELEMENT>可以定义元素
- 判断元素是简单元素还是复杂元素
- 简单元素:没有子元素
- 复杂元素:有子元素的元素
<?xml version="1.0" encoding="UTF-8" ?> <!--注释的内容--> <!--本XML用来描述多个学生的信息--> <students> 复杂元素-------------------<!ELEMENT students(student)> <student id="1"> 复杂元素----------<!ELEMENT student(name,age)> <name>王五</name> 简单元素-----<!ELEMENT name(#PCDATA)> 表示元素为字符串 <age>20</age>简单元素----------<!ELEMENT age(#PCDATA)> 表示元素为字符串 </student> </students>
引入DTD的三种方式
引入dtd的方式 | 说明 |
---|---|
引入本地的dtd | |
在xml文件内部引入 | |
引入网络中的dtd |
DTD 语法规则
定义一个元素的格式为<!ELEMENT 元素名 元素类型>
简单元素
EMPTY:表示标签体为空
ANY:表示标签体可以为空也可以不为空
PCDATA:表示该元素的内容部分为字符串(用的最多)
复杂元素
直接写子元素的名称
有多个子元素可以使用",“或者”|"隔开
","表示定义子元素的顺序
"|"表示子元素只能出现任意一个
定义一个属性的格式:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的类型
CDATA类型:普通的字符串
属性的约束
#REQUIREDL:必须的
#IMPLIED:属性不是必须的
#FIXED value:属性的值是固定的
<!ELEMENT persons (person +) > ---> 表示persons中person可以使用多次
<!ELEMENT person (name,age)> ---> 表示person这个复杂标签有两个标签
<!ELEMENT name (#PCDATA)> ---> 表示name这个简单标签是简单字符串
<!ELEMENT age (#PCDATA)> ---> 表示name这个简单标签是简单字符串
2.1.2 schema约束技术
schema与dtd的区别
- schema约束文件也是一个xml文件,符合xml语法规则,文件后缀名为:xsd
- 一个xml文件可以引入多个schema约束文件,多个schema使用名称空间区分,(类似于java的包名)
- 在dtd中元素的类型比较单一,常见的是PCDATA类型,但是schema里面可以支持多种数据类型
- schema语法更为复杂一点
注意:schema文件事实上也是一个xml文件,可以用来约束其他的xml文件,但是同时,也有可能被其他的文件约束
步骤
- 创建一个文件,改文件的后缀名为.xsd
- 定义文档声明
- schema文件的根标签为:******
- 在标签中定义属性:xmlns=https:www.w3.org/2001/XMLSchema
- 在根标签定义属性:targetNamespace = 唯一的URL地址表示指定当前schema文件的名称空间
- 在根标签定义属性:elementFormDefault = "qualified"表示当前schema文件是一个质量良好的文件
- 通过element定义元素
- 判断当前元素是简单元素还是复杂元素
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itheima.com/javase" elementFormDefault="qualified"
引入schema约束
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="myXml" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance person.xsd"