XML学习笔记(XML Schema)

Schema约束

  1. 什么是Schema约束
           和DTD一样,XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,它的出现克服了DTD的局限性。(DTD约束的笔记)
    DTD和XML Schema对比
DTD XML Schema
DTD采用的是非XML语法格式,缺乏对文档结构、元素、数据类型等全面的描述; XML Schema采用的是XML语法格式,而且它本身也是一种XML文档,因此,XML Schema的语法格式比DTD更好理解;
XML有非常高的合法性要求,虽然DTD和XML Schema都用于对XML文档进行描述,都被用作验证XML合法性的基础,但是DTD本身合法性的验证必须采用另一套机制; XML Schema则采用与XML文档相同的合法性验证机制;
DTD几乎不支持名称空间; XML Schema对名称空间支持的非常好;
DTD支持的数据类型非常有限。例如,DTD可以指定元素中必须包含字符文本(PCADATA),但无法指定元素中必须包含非负整数(nonNegativeInteger); XML Schema比XML DTD支持更多的数据类型,包括用户自定义数据类型;
DTD定义约束能力非常有限,无法对XML实例文档做出更细致的语义限制,例如,无法很好地指定一个元素中的某个子元素必须出现7~12次; XML Schema比XML DTD支持更多的数据类型,包括用户自定义数据类型;

一个简单的Schema文档 Simple.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root" type="xs:string"/>
</xs:schema>

       在Simple.xsd中,第一行是文档声明,第二行中以xs:schema作为根元素,表示模式定义的开始。由于根元素xs:schema的属性都在http://www.w3.org/2001/XMLSchema名称空间中,因此,在根元素上必须声明该名称空间。

  1. 名称空间/命名空间
           一个XML文档可以引入多个约束文档,但是文档中的元素和属性都可以是自定义的,因此会出现命名冲突。在XML文档中,提供名称空间,它可以唯一标识一个元素或属性。
    在使用名称空间时,必须先声明名称空间。名称空间的声明就是在XML实例文档中为某个模式文档的名称空间指定一个临时的简写名称,它通过一系列的保留属性来声明,这种属性的名字必须是以“xmlns”或者以“xmlns:”作为前缀。它与其他任何XML属性一样,都可以通过直接或使用默认的方式给出。
    语法格式: <元素名 xmlns:prefixname="URL">
  • 元素名:指的是在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及该元素中嵌套的所有元素及其属性。
  • xmlns:prefixname:指的是该元素的属性名,他所对应的值是一个URL引用,用来标识该名称空间的名称。如果有两个URL并且其组成的字符完全相同,就可以认为他们标识的是同一个名称空间
/**
 *student.xsd 展示如何使用Schema语法和命名空间
 */
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefaulted="unqualified">
    <xs:element name="学生名册">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="学生">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="姓名" type="xs:string"/>
                            <xs:element name="性别" type="mySex"/>
                            <xs:element name="年龄" type="muAge"/>
                        </xs:sequence>
                        <xs:attribute name="学号" type="xs:integer" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:simpleType name="myAge">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="7"/>
            <xs:maxInclusive value="29"/>
        </xs:restriction>
    </xs:simpleType>


    <xs:simpleType name="mySex">
        <xs:restrivtion base="xs:string">
            <xs:enumeration value="男"/>
            <xs:enumeration value="女"/>
        </xs:restrivtion>
    </xs:simpleType>
</xs:schema>

/**
 *student.xml
 */
<?xml version="1.0" encoding="UTF-8"?>
<学生名册>
    <学生 学号="1">
        <姓名>张三</姓名>
        <性别>男</性别>
        <年龄>20</年龄>
    </学生>
    
    <学生 学号="2">
        <姓名>李四</姓名>
        <性别>女</性别>
        <年龄>19</年龄>
    </学生>
    
    <学生 学号="3">
        <姓名>王五</姓名>
        <性别>男</性别>
        <年龄>21</年龄>
    </学生>
</学生名册>

       注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL:http://www.ljc.cn根本没有指向任何文件,只是一个分配的名字 。
在这里插入图片描述
3. 引入Schema文档
       想要通过XML Schema文件对某个文档进行约束,必须将XML文档与Schema文件进行关联。在XML文档中引入Schema文件有两种方式,集体如下:
(1)使用名称空间引入XML Schema文档
       使用名称空间引入XML Schema文档,需要通过属性xsi:schemaLocation来声明名称空间文档,xsi:schemaLocation属性是在标准命名空间“http://www.w3.org/2001/XMLSchema-instance”中定义的,该属性包含了两个URL,两个URL之间用空白符分隔。

<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.itcase.com"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://www.com xmlbook.xsd>
	<书>
		<书名>javascript权威指南</书名>
		<作者>Flanagan</作者>
		<售价>139元</售价>
	</书>
</书架>

       xsi:schemaLocation属性值中可以包含多对名称空间与他们所对应的XML Schema 文档的存储位置,每一对名称空间的设置信息之间采用空格分隔。

(2)不使用名称空间引入XML Schema文档
       在XML文档中引入XML Schema文档,不仅可以通过xsi:schemaLocation属性引入名称空间的文档,还可以通过xsi:noNamespcaeSchemaLocation属性直接指定。xsi:noNamespcaeSchemaLocation属性也在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义,它用于定义指定文档的位置。

<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
		  xsi:noNamespaceSchemaLocation="xmlbook.xsd">
	<书>
		<书名>javascript权威指南</书名>
		<作者>Flanagan</作者>
		<售价>139元</售价>
	</书>
</书架>
<!-- 文档xmlbook.xsd与引用它的实例文档位于同一目录中 -->

Schema语法

  1. 元素定义
<xs:element name="元素的名称" type="元素的数据类型"/>

其中type数据类型有多种:

  • xs:string:表示字符串类型
  • xs:decimal:表示小数类型
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time
xml示例代码
<bookname>siry</bookname>
<price>50</price>
<birthday>1998-02-28</birthday>

对应的Schema代码
<xs:element name="bookname" type="xs:string"/>
<xs:element name="price" type="xs:integer"/>
<xs:element name="birthday" type"xs:date"/>
  1. 属性的定义:<xs:attribute name="属性的名称" type="属性的数据类型">
xml示例代码
<name lang="EN">siry</name>

对应的Schema代码
<xs:attribute name="lang" type="xs:string">
  1. 简单类型
           在XML Schema文档中,只包含字符数据的元素都是简单类型的。简单类型使用xs:complexType元素定义。如果要对元素进行限制,需要使用xs:restriction元素;
    几种常用的简单类型元素限定元素
  • xs:minInclusive和xs:maxInclusive元素对值的最大值和最小值限定
员工工作年龄要求为18~55岁
<xs:element name="eage">
    <xs:simpleType>
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="18"/>
            <xs:maxInclusive value="55"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
  • xs:enumeration 元素 对一组值的限定
钱包的颜色只能是红色、蓝色、黄色、白色、黑色 
<xs:element name="wallet">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="red"/>
            <xs:enumeration value="blue"/>
            <xs:enumeration value="yellow"/>
            <xs:enumeration value="white"/>
            <xs:enumeration value="black"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
  • xs:pattern 元素对一系列值的限定
希望把XML元素的内容限定为一系列可使用的数字或字母,可以使用模式约束(Pattern Constraint)
<xs:element name="letter">
   <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:pattern value="[a-z]"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>
  • xs:whiteSpace元素对空白字符的限定
whiteSpace元素有3个属性值可以设定,分别是
preserve:表示元素不对任何空白字符进行处理
replace:表示移除所有空白字符
collapse:表示将所有空白字符缩减为一个单一字符
<xs:element name="address">
   <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:whiteSpace value="preserve"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>
  • 更多的限制可以查看W3C文档
  1. 复杂类型
           除去简单类型之外,其他类型都是复杂类型。在定义复杂类型时,需要使用xs:conplexType,其可接受如下两种子元素:
    xs:complexContent:用于定义包含简单内容的复杂类型(开始标记和结束标记之间只包含字符数据)
    xs:simpleContent:用于定义包含复杂内容的复杂类型

复合元素的4中基本类型:

  • 空元素:这里的空元素指的是不包含内容,只包含属性的元素
xml代码
<producet prodid="1234"/>

Schema代码
<xs:element name="product">
    <xs:complexType>
        <xs:attribute name"prodid" type="xs:positiveInteger">
    </xs:complexType>
</xs:element>
  • 包含其他元素的元素
xml代码
<person>
    <firstname>李</firstname>
    <lastname>四</lastname>
</person>

Schema代码
<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:complexType>
</xs:element>
  • 仅包含文本的元素
           对于仅包含文本的复合元素,需要使用simpleContent元素来添加元素。在使用简易内容时,必须在simpleContent元素内定义扩展或限定,这是需要使用extension或restriction元素来扩展或限定元素的基本简单类型。
xml代码
<shoessize country="france">35</shoessize>

Schema代码
<xs:element name="shoessize">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:integer">
                <xs:attribute name="country" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>
  • 包含元素和文本的元素
xml代码
<letter>
    Dear Mr.<name>li</name>.
    Your order <orderid>1032</orderid>
    will be shipped on <shipdate>2019-12-26</shipdate>
</letter>

Schema代码
<xs:element name="letter">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="orderid" type="xs:positiveInteger"/>
            <xs:element name="shipdate" type="xs:date"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
**为了使字符能够出现在letter元素的子元素之间,使用了mixed属性。
发布了3 篇原创文章 · 获赞 2 · 访问量 683

猜你喜欢

转载自blog.csdn.net/BB_andB/article/details/103731016