XML:
XML是可扩展的标记语言
标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
可扩展:标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的
xml学习网站https://www.w3school.com.cn/x.asp
作用:
用于进行存储数据和传输数据
数据交换:不同的计算机语言之间,不同的操作系统之间进行数据交换。
主要作为软件的配置文件
优点:
可读性好
可维护性高
标签的规则:
标签由一对尖括号和合法标识符组成,标签必须成对出现
<!--标签由一对尖括号和合法标识符组成-->
<students>
<!--标签必须成对出现,前边的是开始标签,后边的是结束标签-->
<student></student>
<!--特殊的标签可以不成对,但是必须有结束标记-->
<address/>
<!--标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来-->
<student id="1"></student>
<!--<标签需要正确的嵌套,这是正确的:-->
<student id="1">
<name>张三</name>
</student>
<!--这是错误的:-->
<student id="1">
<name>张三
</student>
</name>
</students>
语法规则:
- XML文件的后缀名为:xml
- 文档声明必须是第一行第一列
- <?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
- version:该属性是必须存在的,这里是版本的意思,必须是1.0
- encoding:该属性不是必须的,告诉使用者打开当前xml文件的时候应该是使用什么字符编码表(一般取值都是UTF-8)
- standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no(yes表示是独立的不依赖)
- 必须存在一个根标签,有且只能有一个
- XML文件中可以定义注释信息
- XML文件中可以存在以下特殊字符
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
Document常用方法:
方法名 | 功能说明 |
---|---|
Element getRootElement() | 通过文档对象得到根元素 |
String getName() | 获取元素名 |
List<Element> elements() | 获取所有子元素 |
List<Element> elements(String name) | 获取知名名字的多个子元素 |
获取文本内容:
通过元素对象得到文本字符串得到文本元素的前提:先得到元素对象
空格、换行、制表符:也是属于文本的一部分,所以在解析xml文件的时候,格式化XML文件要注意。
元素中得到文本有关的方法
Element**元素中的方法 | 说明 |
---|---|
String getText() | 得到元素中文本 |
String elementTextTrim(元素名) | 得到子元素中文本,去掉先后空格 |
String elementText(元素名) | 得到子元素中文本 |
Attribute常用方法:
方法名 | 功能说明 |
---|---|
String getName() | 得到属性的名字 |
String getValue() | 得到属性的值 |
得到属性值的两种方式
- 先得到Attribute对象,再通过Attribute对象得到属性的值
- 通过方法attributeValue()直接得到属性值
解析xml:
DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。 会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值(说白了就跟洋葱一样,一层一层的获取,先获取根标签,再获取子标签,再获取对应的值)
常见的解析工具:
JAXP:
SUN公司提供的一套XML的解析的API
JDOM:
开源组织提供了一套XML的解析的API-jdom
DOM4J:
开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java
pull:
主要应用在Android手机端解析XML
解析的准备工作:
-
下载dom4j:https://dom4j.github.io/
-
将提下载好的dom4j-1.6.1.zip解压,找到里面的dom4j-1.6.1.jar
-
在idea中当前模块下新建一个libs文件夹,将dom4j-1.6.1.jar包复制到文件夹中
-
选中jar包 -> 右键 -> 选择add as library即可
xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!--存储多个学生对象的信息-->
<students>
<student id="1">
<name>韩信</name>
<age>99</age>
</student>
<student id="2">
<name>李白</name>
<age>98</age>
</student>
</students>
学生类:
public class Student {
private String id;
private String name;
private int age;
public Student() {
}
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
解析类:
public class XmlTest {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
// 获取解析器对象
SAXReader saxReader = new SAXReader();
// 利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new FileInputStream("src/xml/demo.xml"));
// 获取到根标签
Element rootElement = document.getRootElement();
// 获取子标签
List<Element> elements = rootElement.elements("student");
ArrayList<Student> list = new ArrayList<>();
// 遍历集合
for (Element element : elements) {
// 获取id的内容
Attribute id = element.attribute("id");
String idValue = id.getValue();
// 获取name的内容
// element:获取指定的子标签
Element name = element.element("name");
String nameText = name.getText();
// 获取age的内容
Element age = element.element("age");
String ageText = age.getText();
// 添加学生到集合
Student student = new Student(idValue, nameText, Integer.parseInt(ageText));
list.add(student);
}
// 遍历集合
for (Student student : list) {
System.out.println(student);
}
}
}
DTD约束:
什么是约束:
用来限定xml文件中可使用的标签以及属性
编写DTD约束步骤
- 创建一个文件,这个文件的后缀名为.dtd
- 看xml文件中使用了哪些元素 <!ELEMENT> 可以定义元素
- 判断元素是简单元素还是复杂元素
- 简单元素:没有子元素。
- 复杂元素:有子元素的元素;
DTD语法规则:
定义元素规则:
定义属性规则:
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束> 属性的类型: CDATA类型:普通的字符串
属性的约束:
#REQUIRED: 属性必须要写
#IMPLIED: 属性不是必需的
#FIXED value:属性值是固定的
引入DTD约束:
dtd约束文件
<!ELEMENT persons (person+)>
<!ELEMENT person (name,age)>
<!--#PCDATA:表示值是字符串-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST person id CDATA #REQUIRED>
<!ATTLIST person id CDATA #IMPLIED>
<!ATTLIST person id CDATA #FIXED value "a">
引入本地dtd:
<!DOCTYPE 根元素名称 SYSTEM ‘DTD文件的路径’>
<?xml version="1.0" encoding="UTF-8" ?>
<!--引入本地dtd-->
<!DOCTYPE persons SYSTEM 'demo.dtd'>
<persons>
<person id="01">
<name>韩信</name>
<age>99</age>
</person>
<person id="02">
<name>李白</name>
<age>98</age>
</person>
</persons>
在xml文件内部引入:
<!DOCTYPE 根元素名称 [ dtd文件内容 ]>
<?xml version="1.0" encoding="UTF-8" ?>
<!--内部-->
<!DOCTYPE persons [
<!ELEMENT persons (person+)>
<!ELEMENT person (name,age)>
<!--#PCDATA:表示值是字符串-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST person id CDATA #REQUIRED>
]>
<persons>
<person id="01">
<name>韩信</name>
<age>99</age>
</person>
<person id="02">
<name>李白</name>
<age>98</age>
</person>
</persons>
引入网络dtd:
<!DOCTYPE 根元素的名称 PUBLIC “DTD文件名称” “DTD文档的URL”>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
schema约束:
schema和dtd的区别
- schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
- 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
- dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
- schema 语法更加的复杂
- schema文件用来约束一个xml文件,同时也被别的文件约束着
编写schema约束步骤:
- 创建一个文件,这个文件的后缀名为.xsd。
- 定义文档声明
- schema文件的根标签为:
- 定义属性: xmlns=http://www.w3.org/2001/XMLSchema
- 定义属性 : targetNamespace =唯一的url地址,指定当前这个schema文件的名称空间。
- 定义属性 :elementFormDefault=”qualifified“,表示当前schema文件是一个质量良好的文件。
- 通过element定义元素
- 判断当前元素是简单元素还是复杂元素
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<persons
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http:www.itzhuzhu.com"
xsi:schemaLocation="http:www.itzhuzhu.com persons.xsd"
>
<person id="001">
<name>张三</name>
<age>23</age>
</person>
</persons>
xsd约束文件
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http:www.itzhuzhu.com"
elementFormDefault="qualified"
>
<!--定义persons复杂元素-->
<element name="persons">
<complexType>
<sequence>
<!--定义person复杂元素-->
<element name="person">
<complexType>
<sequence>
<!--定义name和age简单元素-->
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
<!--定义属性,required( 必须的)/optional( 可选的)-->
<attribute name="id" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>