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实体类型
NMTOKENNMTOKEN类型
NMTOKENSNMTOKEN类型集
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的派生
NCNameName的派生,字符串中不允许“:”
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的内容做限定,这个复合类型没有子元素,只能存在文本或者属性

转载于:https://blog.51cto.com/11230344/2307921

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值