XML学习笔记(三) -- Schema

时间:2023-03-08 21:21:51

标签(空格分隔): 学习笔记


Schema的格式

XML Schema文档是由元素、属性、命名空间和XML文档中的其他节点构成的。

XML Schema有两种重要的Schema模型:Microsoft XML Schema和W3C XML Schema。

例:

1)新建一个schema文件film.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="片名" type="xsd:string"/>
<xsd:element name="主演" type="xsd:string"/>
<xsd:element name="发行情况">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="发行国家" type="xsd:string"/>
<xsd:element name="发行日期" type="xsd:string"/>
<xsd:element name="拷贝数量" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

2)新建xml文件:film.xml

<?xml version="1.0" encoding="GB2312"?>
<电影 xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">
<片名>钢铁侠3</片名>
<主演>小罗伯特·唐尼</主演>
<发行情况>
<发行国家>美国</发行国家>
<发行日期>2013</发行日期>
<拷贝数量>1000</拷贝数量>
</发行情况>
</电影>

在XML Schema的基本结构中,XML Schema文件的根元素必须是schema,schema元素有一个属性xmlns,用于指定整个XML Schema位于http://www.w3.org/2001/XMLSchema名称空间中,名称空间的前缀是xsd。

schema根元素

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...<!--Schema的内容-->
</xsd:schema>
  • xsd:schema -- 表示这是Schema文档的根元素;
  • xmlns是用来声明名称空间的专用关键词,这里的名称空间http://www.w3.org/2001/XMLSchema被映射到xsd前缀 (名称空间的前缀可以使用任意的标识符,而不只局限于xsd)

element元素

XML Schema中的元素是利用element标识符来声明的,语法格式为:

<element bstract|block|default|final|fixed|form|id|maxOccurs|minOccurs|name|nillable|ref|substitutionGroup|type>
<annotation |simplrType|complexType|unique|key|keyref>
</element> 例如:
<xsd:element name="经理" type="xsd:string" maxOccurs="unbounded"/>
<xsd:element name="员工" type="xsd:string" maxOccurs="unbounded"/>

默认值和固定值

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="newname" type="xsd:string"/>
<xsd:element name="type" type="xsd:string" default="sports"/>
<xsd:element name="date" type="xsd:integer" default="20161011"/>
<xsd:element name="count" type="xsd:integer" fixed="1"/>
</xsd:schema>

引用和代替元素

有时候,一个元素在XML文档中的不同位置上出现多次,如果在描述其结构的Schema文档中对于该元素的声明重复定义的话,会造成书写重复也不美观。-- 可以用元素引用来解决这个问题。

<xsd:element name="元素名称" ref="要引用的元素名称">

例子:

*** 使用ref属性实现元素的引用

  1. 新建一个schema文件film.xsd,声明一个“artist”属性,然后在“film”元素中进行引用:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="film">

    xsd:complexType

    xsd:sequence

    <xsd:element name="name" type="xsd:string"/>

    <xsd:element ref="artist"/>

    </xsd:sequence>

    </xsd:comlexType>

    </xsd:element>

    <xsd:element name="artist">

    xsd:complexType

    xsd:sequence

    xsd:choice

    <xsd:element name="starring" type="xsd:string"/>

    <xsd:element name="director" type="xsd:string"/>

    </xsd:choice>

    </xsd:sequence>

    </xsd:complexType>

    </xsd:element>

    </xsd:schema>

  2. 新建xml文件film.xml,并与film.xsd文件相关联:

    钢铁侠3

    小罗伯特·唐尼

  3. 注意:在上例中,使用了ref属性引用了元素artist的声明。

*** 使用ref属性实现元素组的替换

  1. 新建一个schema文件film.xsd

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="film">

    xsd:complexType

    xsd:sequence

    <xsd:element name="name" type="xsd:string"/>

    <xsd:element ref="director"/>

    </xsd:sequence>

    </xsd:complexType>

    </xsd:element>

    <xsd:element name="director" type="xsd:string"/>

    <xsd:element name="starring" type="xsd:string" sunstitutionGroup="director"/>

    </xsd:schema>

  • 解析:在声明"starring"时,使用substitutionGroup元素与director元素相关联,然后在film元素中使用ref元素进行引用。

2)新建一个xml文件film.xml

<?xml version="1.0" encoding="GB2312"?>
<film xmlns:xsi-http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="film.xsd">
<name>钢铁侠3</name>
<starring>小罗伯特·唐尼</starring>
</film>

Schema属性声明

<xsd:attribute name="属性名" type="属性类型"/>

Schema自定义数据类型

1)film.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="片名" type="xsd:string"/>
<xsd:element name="主演" type="主演类型"/>
<xsd:element name="发行情况">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="编号" type="xsd:integer"/>
<xsd:element name="发行时间" type="xsd:string"/>
<xsd:element name="发行国家" type="xsd:string"/>
<xsd:element name="拷贝数量" type="数量类型"/>
</xsd:sequence>
<xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="主演类型">
<xsd:restriction base="xsd:string">
<xsd:minLength value="6"/>
<xsd:maxLength value="20"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="数量类型">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="10000"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
  1. film.xml

    <电影 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="film.xsd">

    <片名>蝙蝠侠3</片名>

    <主演>小罗伯特·唐尼</主演>

    <发行情况>

    <编号>1589874</编号>

    <发行时间>2013</发行时间>

    <发行国家>美国</发行国家>

    <拷贝数量>5000</拷贝数量>

    </发行情况>

    </电影>

复杂类型:simpleContent 和 complexContent

复杂类型与简单类型的根本区别是:复杂类型的内容中可以包含其他元素或属性,而简单类型既不能包含子元素,也不能带有任何属性。

simpleContent

simpleContent是在简单类型的基础上通过增加属性派生而来的,成为扩展派生(extension).

<xsd:element name="元素名称" type="元素类型">
<xsd:complexType name="类型名">
<xsd:simpleContent>
<xsd:extension base="简单类型">
<xsd:attribute name="属性名1" type="属性类型"/>
<xsd:attribute name="属性名2" type="属性类型"/>
....
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>

complexContent

complexContent元素是指元素中包含子元素,且包含属性的复杂元素。

<xsd:element="元素名称" type="元素类型">
<xsd:compexType name="类型名">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<!--子元素声明-->
<!--属性声明-->
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>

其中,一个complexType元素通常会包含多个子元素。XML Schema提供了4种分组结构来指示子元素的顺序,他们是all, sequence, choice, group

  1. all分组:使用all定义的元素组,在组中所有的元素成员都可以出现一次或者根本不出现,而且元素能够以任意顺序出现。

    <xsd:all maxOccurs="0|1" minOccurs="0|1">



    </xsd:all>

  2. sequence分组:sequence分组要求分组序列中的每个成员在实例文档中出现的顺序与定义的顺序相同。出现的次数由maxOccursminOccurs控制。

    xsd:sequence



    </xsd:sequence>

  3. choice分组:choice分组相当于DTD中的"|",当子元素组合到choice中是,这些元素中只有一个元素必须在实例文档中出现,用于互斥的情况。

    <xsd:choice id="ID" maxOccurs="大于或等于0的整数|unbounded" minOccurs="大于或等于0的整数">



    </xsd:choice>

  4. group分组:group分组是将若干个元素声明归为一组,一以便将他们当做一个组并入复杂类型的定义。

    <xsd:group maxOccurs="大于或等于0的整数|unbounded" minOccurs="大于或等于0的整数" name="组名" ref="组名">



    </xsd:group>

例子:

1)sample.xsd

<?xml version="1.0" encoding="GB2312"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema">
<xsd:element name="电影" type="演员"/>
<xsd:complexType name="演员">
<xsd:sequence>
<xsd:group ref="主演"/>
<xsd:element name="片名" type="类型"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="类型">
<xsd:choice>
<xsd:element name="中文" type="string"/>
<xsd:element name="英文" type="string"/>
</xsd:choice>
</xsd:complexType>
<xsd:group name="主演">
<xsd:sequence>
<xsd:element name="男主演" type="string"/>
<xsd:element name="女主演" type="string"/>
</xsd:sequence>
</xsd:group>
</xsd:schema>

2)sample.xml

<?xml version="1.0" encoding="GB2312"?>
<电影 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>
<男主演>小罗伯特·唐尼</男主演>
<女主演>格温妮丝·帕特洛</女主演>
<片名>
<中文>钢铁侠3</中文>
</片名>
</电影>

Schema的名称空间

名称空间是XML Schema中的重要部分,他提供了一种避免元素命名冲突的方法。名称空间的用途在于为XML中使用的名称提供一个容器。

名称空间的类型

XMLSchema中的名称空间共有三种类型:目标名称空间标准名称空间默认名称空间

<xsd:schema targetNamespace="http://www.itzcn.net/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.itzcn.net.xml">

名称空间的引用

  1. 在XML Schema文档中已经定义目标名称空间

    <根元素名称 xmlns="http://www.itzcn.net/xml"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.itzcn.net/xml/要关联的文档名称.xsd" 属性名="属性值"

    />

  2. 在XML Schema文档中没有定义目标名称空间

    如果在XML Schema中只使用了标准名称空间http://www.w3.org/2001/XMLSchema,那就需要使用如下样式来关联XML文档:

    <根元素名称 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:noNamespaceSchemaLocation="要关联的文档名称.xsd"

    属性名="属性值"

    />