java基础-xml
13-2-xml
01-xml-作为配置文件的优势
使用properties
作为配置文件,当编写的配置十分多的时候,会写得很长,不方便:
使用xml
可以很方便:
如果还有其他
servlet
复制一份就好了
02-xml-概述
参考网址:点击跳转
万维网联盟创建的,可扩展标记语言。
- 标记语言:通过标签描述语言。
- 可扩展:标签的名字可以自定义。
作用:
数据的存储和传输数据。
可作为软件的配置文件。
03-xml-标签的规则
- 一堆尖括号和合法标识符组成。
- 成对出现。
- 特殊标签可以不成对出现,但必须有结束标记。
- 标签中可以定义属性,属性和标签名需要空格隔开,属性值必须用引号引起来。
- 标签必须要正确嵌套
04-xml-语法规则
xml文件后缀必须是xml
文档声明必须是第一行第一列
文档声明:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
version必须要写,值固定是1.0
encoding不是必须的
standalone表示该xml文件是否依赖其他的xml文件
必须存在一个根标签,有且只有一个
可以写注释
特殊符号:
可以存在
CDATA
区<![CDATA[ ...内容... ]]>
来个demo:
<?xml version="1.0" encoding="UTF-8" ?>
<!--文档声明必须第一行-->
<students>
<!-- 学生列表 属性有id、name、age、info -->
<student id="1">
<name>赖卓成</name>
<age>25</age>
<info>1<2</info>
<message><![CDATA[这里可以写特殊字符的内容 <<<<<<<>>>>''''""""]]></message>
</student>
<student id="2">
<name>小明</name>
<age>25</age>
</student>
<student id="3">
<name>小红</name>
<age>25</age>
</student>
</students>
浏览器打开,正确无误:
05-xml-DOM解析思想
DOM文档对象模型:把文档的各个组成部分看做城对应的对象。
最初,会把xml文件全部加载到内存,会在内存中形成一个树形结构,在获取对应的值。
绿色:document对象
蓝色:element对象
红色:属性
紫色:文本
06-xml-解析的准备工作
常见的解析工具:JAXP、JDOM、DOM4J、pull(用于安卓手机端)
这里使用dom4j:点击跳转
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
07-xml-解析
需求:
- 解析xml
- 将解析到的数据封装到学生对象中
- 并将学生对象存储到
ArrayList
对象中 - 遍历集合
<?xml version="1.0" encoding="UTF-8" ?>
<!--文档声明必须第一行-->
<students>
<!-- 学生列表 属性有id、name、age、info -->
<student id="1">
<name>赖卓成</name>
<age>25</age>
<info>1<2</info>
<message><![CDATA[这里可以写特殊字符的内容 <<<<<<<>>>>''''""""]]></message>
</student>
<student id="2">
<name>小明</name>
<age>25</age>
</student>
<student id="3">
<name>小红</name>
<age>25</age>
</student>
<aaaaa></aaaaa>
<bbbb></bbbb>
</students>
public class XmlDemo01 {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
File file = new File("java-se\\src\\main\\java\\com\\lzc\\xml\\student.xml");
if (!file.exists()){
throw new RuntimeException("文件不存在");
}
Document read = reader.read(file);
// 获取根节点
Element rootElement = read.getRootElement();
// 获取根节点下的所有节点
List elements = rootElement.elements();
System.out.println("elements = " + elements);
// 获取students集合,我们只需要students下的student,不需要多余的aaa和bbb
List<Element> students = rootElement.elements("student");
System.out.println("students = " + students);
// 获取student的属性,并且创建Java的Student对象
List<Student> studentList = students.stream().map(s -> {
Attribute id = s.attribute("id");
// 这里需要注意,只有id是属性,name和age是元素,获取元素中的文本
Element name = s.element("name");
Element age = s.element("age");
return new Student(id.getValue(), name.getText(), Integer.parseInt(age.getText()));
}).collect(Collectors.toList());
System.out.println("studentList = " + studentList);
}
}
运行结果:
13-3-DTD和schema
08-DTD-入门案例-编写DTD
用来限定xml文件中可以使用的标签以及属性。
xml有两种约束技术:
- DTD
- schema
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>赖卓成</name>
<age>25</age>
</person>
</persons>
对上面的xml,如何写dtd?
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
小括号中表示该元素可以有哪些子元素、#PCDATA意思是字符串
09-DTD-入门案例-引入DTD
在上面的xml中引入:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons SYSTEM 'person.dtd'>
<persons>
<person>
<name>赖卓成</name>
<age>25</age>
</person>
</persons>
SYSTEM
表示引入本地文件
引入后,再乱定义元素就会报错:
10-DTD-三种引入方式
- 引入本地dtd(上一节课的)
- 在xml文件内部引入(xml和dtd写在同一个文件)
- 引入网络dtd
内部引入:将dtd约束写在方括号中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons [
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<persons>
<person>
<name>赖卓成</name>
<age>25</age>
<a></a>
</person>
</persons>
网络引入:
<DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的url">
11-DTD-语法规则-定义元素
定义一个元素的格式为:
<!EMELENT 元素名称 元素类型>
元素类型分两种:
- 简单元素:里面没有其他元素了
- EMPTY:标签体为空
- ANY:可为空也可不为空
- PCDATA:内容为字符串
- 复杂元素:里面还要其他元素
- 多个元素用,或|负号隔开
- ,表示定义子元素的顺序。
- ?表示出现0次或1次
- +表示1次或多次
- *表示0次或多次
- 不写则表示出现1次
- |表示子元素只能出现任意一个
根据规则,优化上面的dtd:
<!ELEMENT persons (person+)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
12-DTD-语法规则-定义属性
格式:
<!ATTLIST 元素名称 属性名称 属性类型 属性约束>
属性类型:
- CDATA:普通字符串
属性约束
- #REQUIRED 必须的
- #IMPLED 不是必须的
- FIXED value 属性值是固定的
例如:
<!ATTLIST person id CDATA #FIXED "p1">
13-schema-schema和dtd的区别
schema也是一个xml文件,符合xml语法,后缀.xsd
一个xml可引入多个schema,多个schema使用命名空间区分(类似Java包名)
dtd元素类型取值较为单一,常见为PCDATA,但是schema可以支持很多个数据类型
14-schema-入门案例编写
还是对这个xml进行编写:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>赖卓成</name>
<age>25</age>
</person>
</persons>
步骤:
- 创建.xsd文件
- 定义声明文档
- 根标签为<schema>
- 在<schema>中定义:xmlns=http://www.w3.org/2001/XMLSchema
- 在<schema>中定义属性targetNamespace=唯一url地址,指定当前这个schema文件的命名空间
- 在<schema>中定义属性:elementFormDefault="qualified",表示这是一个良好的schema文件
- 通过element定义元素
- 判断当前元素是简单元素还是复杂元素
<?xml version="1.0" encoding="UTF-8" ?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http:www.iocaop.com/javase/xml">
<!--定义元素persons-->
<element name="persons">
<!--表示这是一个复杂元素-->
<complexType>
<!--表示需要按顺序写-->
<sequence>
<!--定义person元素-->
<element name="person">
<!--复杂元素-->
<complexType>
<!--顺序-->
<sequence>
<!--定义简单元素 type指定元素类型-->
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
15-schema-引入schema文件步骤
<?xml version="1.0" encoding="UTF-8" ?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http:www.iocaop.com/javase/xml"
xsi:schemaLocation="http:www.iocaop.com/javase/xml person.xsd"
>
<person>
<name>赖卓成</name>
<age>25</age>
</person>
</persons>
换一下顺序,看看约束生效了没:
16-schema-定义属性
示例:
<attribute name="id" type="string" use="required"></attribute>
在原来的xsd中加入:
生效了:必须要id