xml 约束
因为xml里面都是自定义标签,为了让浏览器能够解析,需要定义规则。
一、定义:规定xml文档的书写规则
二、对框架使用则(程序员)的要求
1、能够在xml中引入约束文档。
2、能够简单的独栋约束文档
三、约束文档的分类
1、DTD:一种简单的约束结束
2、Schema:一种复杂的约束技术
四、DTD介绍:
引入DTD文档到XML文档中的方式有:
1、内部DTD:将约束规则定义在xml文档中(不常用)
2、外部DTD:将约束规则定义在外部的DTD文件中,外部DTD分为两种:
(1)、本地文件:
引入格式:<!DOCTYPE 根标签名 SYSTEM "DTD文件位置">
(2)、网络文件
引入格式:<!DOCTYPE 根标签名 PUBLIC "DTD文件名字" "DTD文件的位置,也就是URL">
举例
student.dtd
<!--定义了根标签,名为students,它下面有个子标签,名为student,
student可以出现0~n次(+则表示至少一次),-->
<!ELEMENT students (student*) >
<!--student标签下包含name,age,sex标签,这些标签只能出现一次-->
<!ELEMENT student (name,age,sex)>
<!--#PCDATA表示该标签为字符串-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--ATTLIST student number ID表示student标签有个ID属性(表示不能重复出现),
该属性num称为number,#REQUIRED表示该标签必须,而且student标签有个-->
<!ATTLIST student number ID #REQUIRED>
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<!--内部标签按照如下写法,将上面SYSTEM "student.dtd"替换为 [约束内容] 但是不常用-->
<!--<!DOCTYPE students [-->
<!-- <!ELEMENT students (student*) >-->
<!-- <!ELEMENT student (name,age,sex)>-->
<!-- <!ELEMENT name (#PCDATA)>-->
<!-- <!ELEMENT age (#PCDATA)>-->
<!-- <!ELEMENT sex (#PCDATA)>-->
<!-- <!ATTLIST student number ID #REQUIRED>-->
<!-- ]>-->
<students>
<student number="s1">
<name>张三</name>
<age>21</age>
<sex>male</sex>
</student>
<student number="s2">
<name>李四</name>
<age>21</age>
<sex>male</sex>
</student>
<student number="s3">
<name>王五</name>
<age>21</age>
<sex>male</sex>
</student>
</students>
输出:
五、Schema
DTD能够对标签进行约束,但是不能够对标签里的内容进行约束,而schema则可以对标签内内容进行约束。
引入
1.填写xml文档的根元素
2.引入xsi前缀.
* xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",
这个格式固定,xsi=的取值可以有很多个,具体怎么取值待学习
3.引入xsd文件命名空间,也就是schema约束文档的的路径,比如我们的约束文档名为:student.xsd
* xsi:schemaLocation="http://www.XXXX.cn/xml student.xsd"
student.xsd是约束文档的路径,而http://www.XXXX.cn/xml是对它文件的路径的取的别名,我们一般叫做命名空间,这个别名在以后所有需要使用student.xsd约束文档的标签当中,都需要申明,比如 :
<http://www.XXXX.cn/xml: 标签名>内容<http://www.XXXX.cn/xml: /标签名>,
这样写太麻烦了,就需要给这个别名弄简单点,这就是下面的取前缀
4.为每一个xsd约束声明一个前缀,作为标识:理论上写法是: xmlns:前缀名=http://www.XXXX.cn/xml,这样以后引用student.xsd约束的标签就写成:
<前缀名: 标签名>内容</前缀名: 标签名>
5、如果只有一个约束文档,则可以写成:xmlns=http://www.XXXX.cn/xm,这样引用student.xsd约束的标签就不用写前缀。
举例:
student.xsd
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.XXX.cn/xml"
xmlns="http://www.XXX.cn/xml"
elementFormDefault="qualified">
<!--
1、上面的xmlns:xsd="http://www.w3.org/2001/XMLSchema"是规定写法,
2、targetNamespace="http://www.XXX.cn/xml"表示引入文档的别名,引入文档
的别名要和这个一样
3、 xmlns="http://www.XXX.cn/xml"这个是给别名取个简单的前缀,这里没有前缀
-->
<!--定义一个元素,元素的标签名为students,该标签类型为studentsType,是一个自定义类型-->
<xsd:element name="students" type="studentsType"/>
<!-- 对上面自定义的类型studentsType进行解释,complexType表示它是一个复合类, -->
<xsd:complexType name="studentsType">
<!-- 表示是有顺序-->
<xsd:sequence>
<!-- 表示studentsType类型的标签里面包含了一个元素,约束名为student,
而且类型为studentType,该标签出现个数不限-->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- 对上面自定义的类型studentType进行解释,complexType表示它是一个复合类, -->
<xsd:complexType name="studentType">
<xsd:sequence>
<!-- 表示类型studentType标签内容包含以下标签,标签的类型分别作了规定都是自定义,
而且这些标签都是有顺序的-->
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<!--表示studentType标签包含一个属性,属性名字为number,类型为numberType自定义,
use="required"表示该属性时必须写的-->
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!-- 下面是对上面出现过的标签的自定义类型进行逐个解释,simpleType表示是个简单标签-->
<xsd:simpleType name="sexType">
<!-- 表示sexType标签的包含的内容类型为string(字符串),而且是枚举,取值只能是male、female-->
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<!--表示ageType标签的内容的类型为integer(整数型),取值范围为0~256-->
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<!--对标签numberType的内容类型规定为string,而且内容必须以id_开头,
后面跟4位数字,比如id_0001-->
<xsd:restriction base="xsd:string">
<xsd:pattern value="id_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.XXX.cn/xml student.xsd"
xmlns="http://www.XXX.cn/xml"
>
<student number="id_0001">
<name>zhansan</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="id_0002">
<name>lisi</name>
<age>21</age>
<sex>female</sex>
</student>
<student number="id_0003">
<name></name>
<age>20</age>
<sex>female</sex>
</student>
</students>
输出:
l0510402015 发布了218 篇原创文章 · 获赞 5 · 访问量 1万+ 私信 关注