在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束
常见的xml约束:
DTD
Schema
作为程序员只要掌握两点:
会阅读
会引入
不用自己编写
DTD约束
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
1 编写DTD
开发中,我们不会自己编写DTD约束文档
通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有: Struts2、hibernate等。
创建约束文件 student.dtd
<!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> <!- ELEMENT: 用来定义元素 students (student+) : 代表根元素 必须是 <students> student+ : 根标签中至少有一个 student子元素, + 代表至少一个 student (name,age,sex): student 标签中包含的子元素,按顺序出现 #PCDATA: 是普通文本内容 ATTLIST: 用来定义属性 student number ID #REQUIRED student子元素中 有一个ID属性叫做 number,是必须填写的 ID: 唯一 值只能是字母或者下划线开头 -->
2 引入DTD
<1>引入dtd文档到xml文档中,两种方式
内部dtd:将约束规则定义在xml文档中 (通常不这么做)
外部dtd:将约束的规则定义在外部的dtd文件中
1. 本地方式引入: <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
2. 网络方式引入: <!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
<2> student.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students SYSTEM "student.dtd"> <students> <student number="s1"> <name>小斌</name> <age>22</age> <sex>男</sex> </student> <student number="s2"> <name>广坤</name> <age>55</age> <sex>男</sex> </student> </students>
Schema约束
1 什么是Schema
1. Schema是新的XML文档约束, 比DTD强大很多,是DTD 替代者;
2. Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
3. Schema 功能更强大,内置多种简单和复杂的数据类型
4. Schema 支持命名空间 (一个XML中可以引入多个约束文档)
2 Schema约束示例
student.xsd
<?xml version="1.0" encoding = "UTF-8"?> <xsd:schema xmlns="http://www.lagou.com/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.lagou.com/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType"> <xsd:sequence> <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType>
<xsd:complexType name="studentType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="ageType" /> <xsd:element name="sex" type="sexType" /> </xsd:sequence> <xsd:attribute name="number" type="numberType" use="required"/> </xsd:complexType>
<xsd:simpleType name="sexType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="male"/> <xsd:enumeration value="female"/> </xsd:restriction> </xsd:simpleType>
<xsd:simpleType name="ageType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="200"/> </xsd:restriction> </xsd:simpleType>
<xsd:simpleType name="numberType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="hehe_d{4}"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
Xml Schema的根元素:
3 XML引入Schema约束
xml中引入schema约束的步骤:
1) 查看schema文档,找到根元素,在xml中写出来
<?xml version="1.0" encoding="UTF-8" ?> <students> </students>
2) 根元素来自哪个命名空间。使用xmlns指令来声明
<?xml version="1.0" encoding="UTF-8" ?> <students xmlns="http://www.lagou.com/xml" > </students>
3) 引入 w3c的标准命名空间, 复制即可
<?xml version="1.0" encoding="UTF-8" ?> <students xmlns="http://www.lagou.com/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > </students>
4) 引入的命名空间,跟哪个xsd文件对应?
使用schemaLocation来指定:两个取值:第一个为命名空间 第二个为xsd文件的路径
<?xml version="1.0" encoding="UTF-8" ?> <students xmlns="http://www.lagou.com/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lagou.com/xml student.xsd" > </students>
5) 命名空间
指的是一个环境,所用的标签来自于哪个环境定义的。
6) student.xml
<?xml version="1.0" encoding="UTF-8" ?> <students xmlns="http://www.lagou.com/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lagou.com/xml student.xsd" > <student number="hehe_1234"> <name>张百万</name> <age>25</age> <sex>female</sex> </student> <student number="hehe_0000"> <name>小斌</name> <age>20</age> <sex>male</sex> </student> </students>