401、XML的约束

xml 约束

401、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>

输出:

401、XML的约束

五、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>

输出:

401、XML的约束

401、XML的约束401、XML的约束 l0510402015 发布了218 篇原创文章 · 获赞 5 · 访问量 1万+ 私信 关注
上一篇:java-使用XSOM从元素获取minOccurs属性


下一篇:春季-具有多个名称空间的xml的扩展xsd