XML学习笔记(三)

1、Schema

1.1、什么是Schema

Schema:原称为XSD(XML Schema Definition),是由微软提出的规范,现成为W3C规范
XML Schema是用一套内置的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。
XML Schema规定XML文档实例的结构和每个元素/属性的数据类型

1.2、体验dtd和schema的不同之处

首先创建一个xml文档

<?xml version="1.0" encoding="UTF-8"?>
<student>
    <name>貂蝉</name>
    <age>20</age>
</student>

先使用内部的dtd对xml文档做约束

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<student>
    <name>貂蝉</name>
    <age>20</age>
</student>

那么如果采用schema如何来编写呢?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="name" type="xs:string"></xs:element>
    <xs:element name="age" type="xs:int"></xs:element>
    <!--定义一个数据类型-->
    <xs:complexType name="stuType">
        <xs:sequence>
            <xs:element ref="name"></xs:element>
            <xs:element ref="age"></xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="student" type="stuType"></xs:element>
</xs:schema>

编写一个xml引用此schema

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd01.xsd">
    <name>关羽</name>
    <age>20</age>
</student>

1.3、dtd与Schema的比较

dtd的语法的局限性:

1、dtd使用的是一种语法,而xml使用的是另外一种语法

2、dtd的数据类型是有限的,与我们讲的数据库中数据类型不一致

3、dtd不可以扩展,并且不支持命令空间

Schema的好处:

1、Schema也是遵守xml的语法

2、schema大大扩充了数据类型,也可以自定义自己的数据类型

3、它也支持元素的继承,支持元素组合属性组的概念

4、开发性,多个schema的声明可以应用到一个xml文档中。

1.4、Schema文档的结构

schema文档的结构

mark

引用schema的文档

mark

1.5、Schema中的数据类型(知道即可)

数据类型分类:

简单类型

​ 内置的数据类型(built-in data types)

​ l基本的数据类型(Primitive Data Types)

​ l扩展的数据类型(Deriverd Data Types)

​ 用户自定义数据类型(通过simpleType定义)

复杂类型(通过complexType定义)

基本数据类型

数据类型 描述
string 表示字符串
boolean 布尔型
decimal 代表特定精度的数字
float 表示单精度32位浮点数
double 表示双精度64位浮点数
duration 表示持续时间
dateTime 代表特定的时间
time 代表特定的时间,但是是每天重复的
date 代表日期
hexBinary 代表十六进制数
anyURI 代表一个URI,用来定位文件
QName 代表限定(qualified)名称,即有前缀的字符串

扩展的数据类型

数据类型 描述
ID 用于唯一标识元素
IDREF/ IDREFS 参考ID类型的元素或属性
ENTITY/ENTITIES 实体类型
NMTOKEN NMTOKEN类型
NMTOKENS NMTOKEN类型集
long 表示整型数,大小介于-9223372036854775808 和9223372036854775807之间
int 表示整型数,大小介于-2147483648和 2147483647之间
short 表示整型数,大小介于-32768和32767之间
byte 表示整型数,大小介于-128和127之间
NOTATION 代表 NOTATION类型,QName的派生类型

其他数据类型

数据类型 描述
gYear/gYearMonth 指定格式的日期
gMonth/gMonthDay 指定格式的日期
gDay 指定格式的日期
base64Binary 使用base64-encoded编码的2进制数据
language 语言字符,string的派生
Name 有效的XML字符串,string的派生
NCName Name的派生,字符串中不允许“:”
negativeInteger 表示负整数,<= -1
positiveInteger 表示正整数,>=1
nonNegativeInteger >=0,另有nonPositiveInteger表示<=0
unsignedLong 无符号数,还有un…Int、Short、Byte

数据类型的约束

特性 描述
enumeration 在指定的数据集中选择,限定用户的选值
fractionDigits 限定最大的小数位,用于控制精度
length 指定数据的长度
maxExclusive / minExclusive 指定数据的最大/小值(小于/大于)
maxInclusive / minInclusive 指定数据的最大/小值(小于等于/大于等于)
maxLength / minLength 指定长度的最大/小值
pattern 指定数据的显示规范,具体规则见下页
whiteSpace 空白字符的处理:preserve/replace/collapse
precision 十进制数据允许的位数
scale 小数部分的位数

正则描述

规范 描述
\d 任意一个数字,如:Chap\dàChap1、Chap9……
* 前的字符任意重复,如:abàb、ab、aaaaab……
[ ] [ ]内的字符集中任意一个,如:[xyz]aàxa、ya、za
?前的字符出现0或1次
+ + 前的字符至少出现1次
- 指定范围,如:[a-d]yàay、by、cy、dy
{n} { }前的字符出现n次,如:a{3}xàaaax
{min,max} { }前的字符至少出现min次,至多max次,如:a{1,3}xàax、aax、aaax

1.5、Schema中的元素类型

•schema、element、attribute、group、attributeGroup

•simpleType

•simpleContent

•complexType

1.5.1、element

案例:xsd02.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<!--定义是一个类型-->
<xs:complexType name="heroType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="heros" type="herosType"></xs:element>

</xs:schema>

xml文件引用

<?xml version="1.0" encoding="UTF-8"?>
<heros xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd02.xsd">
    <hero>
        <name>关羽</name>
        <type>战士</type>
    </hero>
    <hero>
        <name>曹操</name>
        <type>战士</type>
    </hero>
    <hero>
        <name>亚瑟</name>
        <type>战士</type>
    </hero>
    <hero>
        <name>安其拉</name>
        <type>法师</type>
    </hero>
</heros>

1.5.2、group元素

把一组元素声明组合在一起,以便它们能够一起被复合类型应用

案例,使用group组来进行改写代码

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>

<!--定义一个元素组-->
<xs:group name="myElGroup">
    <xs:sequence>
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:group>
<!--定义是一个类型-->
<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="heros" type="herosType"></xs:element>

</xs:schema>

实际上xml文件并不需要发生任何的改变

1.5.3、attribute和attributeGroup

案例1:直接定义属性

<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
    <xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
    <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
    <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:complexType>

然后我们在使用attributeGroup来定义属性组

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>

<!--定义一个元素组-->
<xs:group name="myElGroup">
    <xs:sequence>
        <xs:element ref="name"></xs:element>
        <xs:element ref="type"></xs:element>
    </xs:sequence>
</xs:group>
<xs:attributeGroup name="myAttrGroup">
    <xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
    <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
    <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:attributeGroup>
<!--定义是一个类型-->
<xs:complexType name="heroType">
    <xs:group ref="myElGroup"></xs:group>
    <xs:attributeGroup ref="myAttrGroup"></xs:attributeGroup>
</xs:complexType>

<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
    <xs:sequence maxOccurs="unbounded">
        <xs:element ref="hero"></xs:element>
    </xs:sequence>
</xs:complexType>
<xs:element name="heros" type="herosType"></xs:element>
</xs:schema>

1.5.4、simpleType

•作用:定义一个简单类型,它决定了元素和属性值的约束和相关信息

•属性:name

•内容:应用已经存在的简单类型,三种方式:

restriction:限定一个范围

list:从列表中选择

union:包含一个值的结合

案例1:schema文件定义:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:simpleType name="myAge">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="0"></xs:minInclusive>
            <xs:maxInclusive value="100"></xs:maxInclusive>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="sname" type="xs:string"></xs:element>
    <xs:element name="age" type="myAge"></xs:element>
    <xs:complexType name="stuType">
        <xs:sequence minOccurs="1" maxOccurs="unbounded">
            <xs:element ref="sname"></xs:element>
            <xs:element ref="age"></xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="student" type="stuType">  
    </xs:element>
</xs:schema>

引用

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
    <sname>貂蝉</sname>
    <!--此时age中内容必须符合myage的定义要求-->
    <age>100</age>
</student>

案例2:

<xs:simpleType name="mybirthday">
        <xs:list itemType="xs:date"></xs:list>
</xs:simpleType>

引用

<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
    <sname>貂蝉</sname>
    <!--此时age中内容必须符合myage的定义要求-->
    <age>100</age>
    <birthday>2012-01-22 2018-02-22</birthday>
</student>

案例3:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义了一个属性-->
<xs:attribute name="allframesize">
  <xs:simpleType>
    <!--联合-->
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="roadbikesize"/>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="mountainbikesize"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:attribute>

<!--定义了一个simpleType类型-->
<xs:simpleType name="roadbikesize">
  <xs:restriction base="xs:positiveInteger">
    <xs:enumeration value="16"/>
    <xs:enumeration value="20"/>
    <xs:enumeration value="28"/>
  </xs:restriction>
</xs:simpleType>

<!--定义了一个simpleType类型-->
<xs:simpleType name="mountainbikesize">
  <xs:restriction base="xs:string">
    <xs:enumeration value="small"/>
    <xs:enumeration value="medium"/>
    <xs:enumeration value="large"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="name" type="xs:string"></xs:element>
<xs:complexType name="stuType">
    <xs:sequence minOccurs="1" maxOccurs="5">
        <xs:element ref="name"></xs:element>
    </xs:sequence>
    <xs:attribute ref="allframesize"></xs:attribute>
</xs:complexType>
<xs:element name="student" type="stuType"></xs:element>

</xs:schema>

引用文件

<?xml version="1.0" encoding="UTF-8"?>
<!--allframesize的值可以是roadbikesize或者mountainbikesize-->
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd04.xsd" allframesize="small">
    <name></name>
</student>

1.5.5、complexType和simpleContent元素

complexType:定义一个复合类型,它决定了一组元素和属性值的约束和相关信息

simpleContent:应用于complexType,对它的内容进行约束和扩展。

案例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="stuType">

        <xs:simpleContent>
            <!--内容只能放小数-->
         <xs:extension base="xs:decimal">
             <!--stuType有一个属性sizing-->
            <xs:attribute name="sizing" use="required">
                <!--属性是基于simpleType类型的-->
                <xs:simpleType>
                 <xs:restriction base="xs:string">
                    <xs:enumeration value="US"/>
                    <xs:enumeration value="Euro"/>
                    <xs:enumeration value="UK"/>
                 </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
         </xs:extension>
        </xs:simpleContent>

    </xs:complexType>

    <xs:element name="student" type="stuType"></xs:element>
</xs:schema>

引用schema文件

<?xml version="1.0" encoding="UTF-8"?>
<student sizing="US" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd05.xsd">
    10.1
</student>

总结一下:

SimpleType:基于已有数据类型的扩展

ComplexType:定义一个复合类型

SimpleContent:对ComplexType的内容做限定,这个复合类型没有子元素,只能存在文本或者属性

猜你喜欢

转载自blog.51cto.com/11230344/2307921
今日推荐