XML 的学习笔记2

XML编写约束

作为一个技术的使用者,我们怎么样编写xml文档才能够给程序读懂呢?如我们使用Spring MVC框架,这个时候就可以通过XML文档与这个半成品软件(框架)进行交互。研究者在编写框架的时候,是不知道我们将来编写的XML文档是怎么样的,这个时候就需要一个约束来规定编写,使得技术使用者能够通过阅读框架研究者编写的约束文档,来书写XML文档。

  • 作为框架的使用者(程序员):
    • 我们要能够在xml中引入约束文档
    • 还需要能够读懂约束文档

约束分类

  1. DTD:一种简单的约束技术
  2. Scheme:一种复杂的约束技术

DTD约束的使用

  1. 引入dtd文档到xml文档中。

    • 引入方式:

      • 内部引入:将约束规则定义在xml文档中

      • 外部引入:将约束规则定义在外部的dtd文件中

        • 外部引入的分类:

          • 本地引入:

            <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
            
          • 网络引入:

            <!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
            

举例

  1. 定义一个dtd约束文档

    <!ELEMENT students (student+) >
    <!ELEMENT student (name,age,sex)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>
    
    • 文档说明:
      • 通过 ELEMENT 来定义标签,通过 ATTLIST 来定义属性。
      • 文档第一行声明了一个 students 标签,students 标签里面需要放一个或多个 student 子标签。
      • 文档第二行定义了一个 student 标签,每个 student 标签里面可以放 name, age, sex 标签各一个,且需要按顺序。
      • #PCDATA 声明的是该标签是字符串标签。
      • 文档最后一行, 声明 student 标签有属性,属性名为 number,属性类型为 ID(即属性值必需唯一,不能重复)。#REQUIRED 规定该属性必须出现。
  2. 按照 dtd 约束文档,编写 xml 文档

    1. xml 文档声明

      <?xml version="1.0" encoding="UTF-8" ?>
      
    2. 引入dtd文档到xml文档中

      1. 外部引入

        <!DOCTYPE students SYSTEM "student.dtd">
        
      2. 内部引入

        <!DOCTYPE students [
                <!ELEMENT students (student+) >
                <!ELEMENT student (name,age,sex)>
                <!ELEMENT name (#PCDATA)>
                <!ELEMENT age (#PCDATA)>
                <!ELEMENT sex (#PCDATA)>
                <!ATTLIST student number ID #REQUIRED>
            ]>
        
    3. 根据 dtd 约束文档,编写 xml 文档内容

      <students>
          <student number="A2018">
              <name>Lee Hua</name>
              <age>21</age>
              <sex>male</sex>
          </student>
      
          <student number="B2018">
              <name>Rainbow</name>
              <age>20</age>
              <sex>female</sex>
          </student>
      </students>
      

      必须要按照约束来编写 xml 文档,否则会编译报错。

    4. 这个xml文档的所有内容如下:

      1. 本地外部引入

        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE students SYSTEM "student.dtd">
        <students>
            <student number="A2018">
                <name>Lee Hua</name>
                <age>21</age>
                <sex>male</sex>
            </student>
        
            <student number="B2018">
                <name>Rainbow</name>
                <age>20</age>
                <sex>female</sex>
            </student>
        </students>
        
      2. 内部引入

        <?xml version="1.0" encoding="UTF-8" ?>
        <!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="A2018">
                <name>Lee Hua</name>
                <age>21</age>
                <sex>male</sex>
            </student>
        
            <student number="B2018">
                <name>Rainbow</name>
                <age>20</age>
                <sex>female</sex>
            </student>
        </students>
        
  3. dtd 的的简单理解就完成了

Scheme约束的简单了解

对于dtd这个简单的约束技术,是有一定的缺陷的,比如上面的例子中:

<student number="A2018">
    <name>Lee Hua</name>
    <age>21</age>
    <sex>male</sex>
</student>

对于age标签的内容、sex标签的内容,都无法进行约束,如我们把年龄(age)设置为1000,性别(sex)设置为 ABC,这明显是不行的,所以这个时候我们就可以使用更为复杂的约束 —— Scheme

XML Schema 是 DTD 的继任者

  1. XML Schema 可针对未来的需求进行扩展
  2. XML Schema 更完善,功能更强大
  3. XML Schema 基于 XML 编写
  4. XML Schema 支持数据类型
  5. XML Schema 支持命名空间

定义一个Scheme约束文档

直接对于这个定义的Scheme文档进行理解。

XmlScheme.png

  1. <?xml version="1.0"?>
    

    XML Scheme 版本声明

  2. <xsd:schema></xsd:schema>
    

    对上面结点内的简述:

    1. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      

      代码说明此schema中使用的元素和数据类型来自于"http://www.w3.org/2001/XMLSchema"名称空间(namespace)。它同样指出来自于"http://www.w3.org/2001/XMLSchema"名称空间的(全局)元素和数据类型必须使用带"xsd: "前缀。

    2. 备注:对于任何一个XML Schema定义文档都有一个最顶层的schema元素。而且该schema元素定义必须包含这个名称空间:http://www.w3.org/2001/XMLSchema。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。

    3. targetNamespace="http://www.w3schools.com" 
      

      表明此 schema 定义的元素来自于"http://www.w3schools.com"名称空间。也就是说在引用该 Schema 的其它文档(包括自身文档)中要声明名称空间,其 URI 应该是 targetNamespace 的属性值。

    4. elementFormDefault="qualified"
      

      该属性值为 qualified 时,说明非全局元素必须添加命名空间的前缀。

      该属性值为 unqualified 时,说明非全局元素不必也不能添加前缀。

  3. <xsd:element name="students" type="studentsType"/>
    

    这里的 element ,必须使用 "xsd:" 前缀。定义一个元素,元素名称为"students",类型为"studentsType"。此类型为自定义类型。下面需要声明这个自定义类型。

  4. <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    

    对上面这个结点的简述:

    1. xsd:complexType name="studentsType"
      

      这里的 complexType ,必须使用 "xsd:" 前缀。声明一个(自定义)类型,类型名称为"studentsType"。

    2. <xsd:sequence>
          <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      

      这里的 sequence 和 element ,必须使用 "xsd:" 前缀。"xsd:element" 定义了一个元素,元素的名称为"student",类型为"studentType"。这个 student 元素最少出现0次,最多次数没有指定,即0次或多次。

  5. <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>
    

    对上面这个结点的简述:

    1. <xsd:complexType name="studentType"> ... </xsd:complexType>
      

      自定义一个类型"studentType"。

    2. <xsd:sequence> ... </xsd:sequence>
      

      里面定义的内容都需要按顺序。

    3. <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="age" type="ageType" />
      <xsd:element name="sex" type="sexType" />
      

      定义了三个元素,这三个元素的名称分别是 name、age、sex ,这三个元素的类型分别是string类型、ageType类型、sexType类型。其中string类型是已有类型,其余两个类型需要自定义。

    4. <xsd:attribute name="number" type="numberType" use="required"/>
      

      定义一个属性,属性名称为 "number",类型为 "numberType" ,且这个属性不需要使用。属性类型为自定义类型。

  6. <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="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="stringbug_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
    

    对上面这三个结点的简述:

    1. xsd:simpleType 定义一个简单的类型

    2. <xsd:simpleType name="sexType">
          <xsd:restriction base="xsd:string">
              <xsd:enumeration value="male"/>
              <xsd:enumeration value="female"/>
          </xsd:restriction>
      </xsd:simpleType>
      

      定义一个简单的数据类型,基本的数据类型是string,enumeration 即枚举,数据只能在 "male" 和 "female" 之间选择。

    3. <xsd:simpleType name="ageType">
          <xsd:restriction base="xsd:integer">
              <xsd:minInclusive value="0"/>
              <xsd:maxInclusive value="256"/>
          </xsd:restriction>
      </xsd:simpleType>
      

      定义一个简单的数据类型,基本的数据类型是integer,最大数字是256,最小数字书0。

    4. <xsd:simpleType name="numberType">
          <xsd:restriction base="xsd:string">
              <xsd:pattern value="stringbug_\d{4}"/>
          </xsd:restriction>
      </xsd:simpleType>
      

      定义一个简单的数据类型,基本的数据类型是string。

      <xsd:pattern value="stringbug_\d{4}"/>
      

      "pattern" 定义一个正则规则,正则表达式为:"stringbug_\d{4}"

XML 文档含有对 XML Scheme 的引用

如上定义的XML Scheme 约束,下面简单引用这个约束:

<?xml version="1.0" encoding="UTF-8"?>
<students
        xmlns="http://www.w3schools.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.w3schools.com student.xsd"
>
    <student number="stringbug_2020">
        <name>Lee Hua</name>
        <age>21</age>
        <sex>male</sex>
    </student>

    <student number="stringbug_2018">
        <name>Rainbow</name>
        <age>20</age>
        <sex>female</sex>
    </student>
</students>

其中,

xmlns="http://www.w3school.com"

定义了该xml元素的默认命名空间为"http://www.w3school.com"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

又定义了一个命名空间,和前缀xsi关联,

xsi:schemaLocation="http://www.w3schools.com student.xsd"

设置xsi前缀代表的命名空间中的一个属性schemaLocation为"http://www.w3schools.com student.xsd"

student.xsd 为 scheme 约束文件的文件名,http://www.w3schools.com 为命名空间。Schema中的targetNamespace属性值必须和xsi:schemaLocation属性的第一个值相同

浏览器中打开:
XmlScheme02.png

备注

如果需要引入多个 scheme 约束文件,那么我们就需要对这些引入的约束进行命名,用以区分,举例如:

<?xml version="1.0" encoding="UTF-8"?>
<students
        xmlns:nameDistinction="http://www.w3schools.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.w3schools.com student.xsd"
>
    <nameDistinction:student number="stringbug_2020">
        <name>Lee Hua</name>
        <age>21</age>
        <sex>male</sex>
    </nameDistinction:student>

    <nameDistinction:student number="stringbug_2018">
        <name>Rainbow</name>
        <age>20</age>
        <sex>female</sex>
    </nameDistinction:student>
</students>

对比一下 XML 文档含有对 XML Scheme 的引用备注 的例子中的区别。

其中最主要的是:

  1. 使用自己定义的student.xsd约束文件

  2. 引入student.xsd约束文件

    1. XML 文档含有对 XML Scheme 的引用 例子

      xmlns="http://www.w3schools.com"
      

      采用默认命名,后续的标签都默认使用该约束

    2. 备注 中例子

      xmlns:nameDistinction="http://www.w3schools.com"
      

      这里使用命名为nameDistinction,这个名字可以自己随意定义,后续标签如果需要使用该约束,那么就需要在每个标签中添加":nameDistinction"。如:

      <nameDistinction:student number="stringbug_2020"> ... </nameDistinction:student>
      

      而对于 XML 文档含有对 XML Scheme 的引用 例子,不需要添加,因为下面使用的标签都需要根据所引入的约束来编写,如:

      <student number="stringbug_2020"> ... </student>
      
posted @ 2021-03-04 12:20  LeeHua  阅读(130)  评论(0编辑  收藏  举报