XML:XML约束

在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>    

 

posted @ 2021-07-27 11:37  Jasper2003  阅读(127)  评论(0编辑  收藏  举报