• XML Schema笔记


    XML Schema是为了弥补DTD的不足而开发的一种新的用于约束和规范XML文档的标准

    XML Schema作用:

    定义可出现在文档中的元素
    定义可出现在文档中的属性
    定义哪些元素是子元素
    定义子元素的次序
    定义子元素的数目
    定义元素和属性的数据类型
    定义元素和属性的默认值和固定值

    XML Schema优点(相对于DTD):

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

    XML Schema对命名空间的支持:

    XML Schema支持命名空间,使用命名空间可以明确表示出XML文档中的元素、属性和其他
    标记,避免名称冲突带来的问题。
    名称冲突,例如:两个不同文档采用同样的元素或属性名称描述两个不同类型的内容
    <?xml version="1.0" encoding="utf-8"?>
    <info>
      <student>
        <name>Lucy</name>
        <age>18</age>
      </student>
      <teacher>
        <name>Brun</name>
        <age>40</age>
      </teacher>
    </info>
    上述的 <name> <age> 在 <student> <teacher> 中元素名一样,但针对的对象不同含义
    不同,在使用XML文档时,可能出现命名混淆。
     
    命名空间采用在元素或属性名之前使用一个唯一的标识符,将不同的标识符对元素或属
    性进行划分,是其被设置在不同的空间中。
    XML为保证标识符的唯一性,使用URI来定义标识符
     
    命名空间的定义:
    前置命名法:
    语法规则:<元素名 xmlns:标识符="URI">
    <?xml version="1.0" encoding="utf-8"?>
    <student:info xmlns:student="https://www.student.net" xmlns:teacher="https://www.teacher.net">
      <student:studentInfo student:id="001">
        <student:name>Lucy</student:name>
        <student:age>18</student:age>
      </studentInfo>
      <teacher:teacherInfo>
        <teacher:name>Brun</teacher:name>
        <teacher:age>40</teacher:age>
      </teacher:teacherInfo>
    </student:info>
    上述文档使用student、teacher两个标识符
    注意:在使用前置命名法时,需要在文档中每个元素增加命名空间标识符
     
    默认命名法:
    语法规则:<标记名 xmlns="URI">
    <?xml version="1.0" encoding="utf-8"?>
    <info xmlns="https://wwww.default.net" xmlns:teacher="https://www.teacher.net">
      <studentInfo id="001">
        <name>Lucy</name>
        <age>18</age>
      </studentInfo>
      <teacher:teacherInfo>
        <teacher:name>Brun</teacher:name>
        <teacher:age>40</teacher:age>
      </teacher:teacherInfo>
    </info>
    上述文档中使用xmlns声明了一个默认命名空间,元素中没有使用命名空间前缀的,表示这
    些元素在默认命名空间中
     
    XML Schema是基于XML文档编写的,保存文件的扩展名为 .xsd

    XML Schema文档结构:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="someURI">
      <!-- XML Schema文档中元素及属性 -->
      <xs:element name="xxx" type="yyy"/>
      ...
    </xs:schema>
    schema是每个XML Schema文档的根元素
    <xs:schema xmlns:xs="someURI"> 表示在XML Schema中使用了命名空间机制,其标识符
    为 xs
     
    将一个定义好的XML Schema文档引入XML文档:
    <根元素 xmlns:xsi="someURI"
            xsi:noNamespaceSchemaLocation="xsdURI">
    xsi:noNamespaceSchemaLocation="xsdURI" : 指定XML Schema文件的路径

    数据类型:

    通过对数据类型的支持,XML Schema:
    更容易描述允许的文档内容
    更容易验证数据的正确性
    更容易与来自数据库的数据一起工作
    更容易定义数据约束
    更容易定义数据模型(数据格式)
    更容易在不同数据类型间转换数据

    常见数据类型:

    integer     整型
    string      字符串
    decimal     十进制
    float       单精度32位浮点数
    double      双精度64为浮点数
    boolean     布尔类型
    date        日期类型:YYYY-MM-DD
    time        时间类型:hh:mm:ss
    dateTime    日期时间类型:YYYY-MM-DDhh:mm:ss
    anyURI      元素中包含一个URI 

    XML Schema限定:

    当XML Schema规定的数据类型无法满足需要时,可以为XML元素或者属性自行定义可
    接受的值类型
    XML Schema简单类型:
    语法规则:
    <xs:simpleType>
      <xs:restriction base="xs:xxx">
        <xs:数据类型细节描述 value="value">
        ...
      </xs:restriction>
    <xs:simpleType>
    数据类型的限定:
    enumeration  定义可接受值的一个列表
    fractionDigits  定义所允许的最大的小数位数。必须大于等于0。
    length    定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
    maxExclusive  定义数值的上限。所允许的值必须小于此值。
    maxInclusive  定义数值的上限。所允许的值必须小于或等于此值。
    maxLength   定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
    minExclusive  定义数值的下限。所允许的值必需大于此值。
    minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
    minLength   定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
    pattern   定义可接受的字符的精确序列。
    totalDigits  定义所允许的阿拉伯数字的精确位数。必须大于0。
    whiteSpace   定义空白字符(换行、回车、空格以及制表符)的处理方式。

    复杂类型:
    语法规则:
    <xs:complexType>
      <xs:某个限定作用的元素>
        <xs:element name="xxx_1" type="xs:yyy_1"/>
        <xs:element name="xxx_2" type="xs:yyy_2"/>
      </xs:某个限定作用的元素>
    </xs:complexType>

    XML Schema属性:

    属性的定义:
    <xs:attribute name="xxx" type="xs:yyy"/>
    <xs:attribute name="xxx" type="xs:yyy" default="value"/>
    <xs:attribute name="xxx" type="xs:yyy" fixed="value"/>
    name  表示属性名
    type  表示属性数据类型
    default 表示默认值
    fixed   表示固定值
     
    属性值默认是可选的,若要规定属性值必须要有,则使用use属性:
    <xs:attribute name="xxx" type="xs:yyy" use="required"/>
    use属性可选值有:
    optional    表示属性可有可无,作为为默认值
    required    表示属性必须存在
    prohibited  表示禁止该属性
    XML Schema元素:

    简易元素:
    仅包含文本的元素,不包含其他元素或属性
    语法规则:<xs:element name="xxx" type="xs:yyy"/>
    xxx 表示元素名
    yyy 表示元素类型
     
    简易元素的默认值
    语法规则:<xs:element name="xxx" type="xs:yyy" default="value"/>
    value 是元素 xxx 的默认值,当未给xxx某个规定值时,value就被分配给该元素
     
    简易元素的规定值
    语法规则:<xs:element name="xxx" type="xs:yyy" fixed="value"/>
    元素xxx值被规定为value,无法改变
     
    复合元素:
    具有属性或其它子元素的元素
     
    复合元素的类型(下列类型元素都可以具有属性):
    空元素
    包含其他元素的元素
    仅包含文本的元素
    包含元素和文本的元素
     
    XML Schema中复合元素的定义:
    语法规则:
    第一种:
    <xs:element name="xxx">
      <xs:complexType>
        <xs:某个限定作用的元素>
          <xs:element name="xxx_1" type="xs:yyy_1"/>
          <xs:element name="xxx_2" type="xs:yyy_2"/>
        </xs:某个限定作用的元素>
      </xs:complexType>
    </xs:element>

    第二种:

    <xs:element name="xxx" type="someType"/>
    
    <xs:complexType name="someType">
      <xs:摸个限定作用的元素>
        <xs:element name="xxx_1" type="xs:yyy_1"/>
        <xs:element name="xxx_2" type="xs:yyy_2"/>
      </xs:摸个限定作用的元素>
    </xs:complexType>
    第一种描述方法定义的复合类型只能用于xxx元素,而第二种定义的复合类型可被其他
    元素引用,<xs:element name="xxx" type="someType"/>
     
    如果XML Schema中,一个元素在不同位置出现不止一次,可以使用:
    <xs:element ref="子元素名">
    其中 ref 属性使用已定义的元素,并将其直接指向另一个元素定义模板

    常用元素:

    element         声明元素
    simpleType      简单类型
    complexType     复杂类型
    simpleContent   描述复杂类型中的简单数据内容
    complexContent  描述复杂类型中的复杂数据类型
    attribute       声明属性
    attributeGroup  声明属性组
    restriction     设定约束条件
    extension       设定扩展内容
    all             任意顺序
    choice          选择关系
    sequence        顺序关系
    annotation      XML文档注解
    documentation   annotation子元素,描述注解内容

    指示器元素:

    Order 指示器:定义元素顺序
    all       规定子元素可以按照任意顺序出现
    choice    规定可出现某个字元素或可出现另一个子元素(非此即彼)
    sequence  规定子元素必须按照特定顺序出现
     
    Occurrence 指示器:定义元素出现频率
    maxOccurs   规定某个元素可出现的最大次数
    minOccurs   规定某个元素可出现的最小次数
    <xs:element name="someName", type="someType", maxOccurs="value"/>
    <xs:element name="someName", type="someType", minOccurs="value"/>
    maxOccurs、minOccurs也可以一起使用
     
    Group 指示器:定义相关数批元素
    group 元素组
    <xs:group name="GroupName">
      <xs:Order>(Order指示器在定义group时必须定义)
        ...(元素组中的元素)
      </xs:Order>
    </xs:group>

    attributeGroup 属性组

    <xs:attributeGroup name="属性组名">
      ...(属性组中包含的各个属性的定义)
    </xs:attributeGroup>

    any元素

    <xs:any/>;通过未被 schema 规定的元素来拓展 XML 文档

    <xs:element name="person">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
          <xs:any minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    
    
    <person>
    <firstname>David</firstname>
    <lastname>Smith</lastname>
    <children>
      <childname>mike</childname>
    </children>
    </person>

    anyAttribute元素
    <xs:anyAttribute/> : 通过未被 schema 规定的属性来扩展 XML 文档

    <xs:element name="person">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
        <xs:anyAttribute/>
      </xs:complexType>
    </xs:element>
    
    <person gender="male">
    <firstname>David</firstname>
    <lastname>Smith</lastname>
    </person>

    元素替换:

    <xs:element name="name" type="xs:string"/>
    <xs:element name="navn" substitutionGroup="name"/>
    在上面的例子中,"name" 元素是主元素,而 "navn" 元素可替代 "name" 元素,在XML文档
    中使用name元素的地方可以使用navn元素替换
    注意:
    可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主
    元素的类型相同,那么就不必规定可替换元素的类型
    substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素
    全局元素:指 "schema" 元素的直接子元素,而本地元素指嵌套在其他元素中的元素

    阻止元素替换:
    <xs:element name="name" type="xs:string" block="substitution"/>
    <xs:element name="navn" substitutionGroup="name"/>
    在XML文档中不能再用navn元素替换name元素
  • 相关阅读:
    python 模块特点
    python 对象类型有哪些?
    python 异常处理
    python urllib2查询数据
    哈希表之词频统计
    泛型 队列
    大小端存储
    收藏 去掉 html 标签的perl 小函数
    好玩 多线程 显示
    服务器客户端 之 文件下载
  • 原文地址:https://www.cnblogs.com/lnlin/p/9575693.html
Copyright © 2020-2023  润新知