zoukankan      html  css  js  c++  java
  • 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>
        
    Good Good Write Bug, Day Day Up
  • 相关阅读:
    动手做第一个Chrome插件
    Discuz NT 架构剖析之Config机制
    用游标实现查询当前服务器所有数据库所有表的SQL
    Discuz X3.2 网站快照被劫持的解决方法
    centos下MYSQL 没有ROOT用户的解决方法。
    redis命令1
    在当今快节奏的软件更迭当中,我们是否还需要进行系统的学习?
    StructureMap 代码分析之Widget 之Registry 分析 (1)
    C#面试题汇总(未完成)
    C#:解决WCF中服务引用 自动生成代码不全的问题。
  • 原文地址:https://www.cnblogs.com/liyihua/p/14477543.html
Copyright © 2011-2022 走看看