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;}@Overridepublic 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" ?><personsxmlns: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>