xml schema全接触

来源:互联网 发布:mac口红价位 编辑:程序博客网 时间:2024/05/01 07:48
 

xml定义语言:dtd,xdr和xsd

 

我们知道xml文档有格式良好和有效性两种约束。格式良好适合于所有的xml文档,即满足xml标准中对于格式的规定。而当xml文档满足一定的语义约束则称该xml文档为有效的xml文档。目前常用的xml定义语言有dtd,xdr和xsd。

 

文档类型定义(dtd)

 

文档类型定义用不同于xml的独立语法来规定了Xml文档中各种元素集合的内容模式。该语言直接沿袭了定义sgml语言的方法。

 

 

  • dtd使得xml文档保持一致

     

     

  • dtd可以共享

     

     

  • dtd提供了对xml语汇的形式化和完整的定义

     

     

  • 每个xml文档有单个的dtd来限制

     

     

    schema

     

    类似dtd,schema可以规定一套特定文档的结构或模型。使用schema语言来描述文档结构有下面以下好处:

     

     

  • schema使用的是xml语法

     

     

  • schema可以用xml解析器来解析

     

     

  • schema允许全局性元素(在整个xml文档中元素用相同方式来使用)和局部性元素(元素在特定的上下文中有不同的含义)

     

     

  • schema提供丰富的数据类型(如整型、布尔型、日期类型等);而且一个元素中的数据类型可以进行规定,甚至可以根据需要自定义数据类型

     

    xdr

     

    xdr的全称是xml-data reduced language,是早先由xml-data草案派生出来的一个定义xml语言的分支。由于微软最先提出了xml-data,并且经过修订后在其软件中应用,所以xdr也被广泛使用。目前支持xdr schema的产品有:

     

     

  • microsoft biztalk server

     

     

  • microsoft sql server 2000

     

     

  • microsoft office 2000

     

     

  • microsoft ie5.0和后续版本

     

     

    xdr也得到了extensibility的 xml authority编辑工具的支持。

     

    xsd schema

     

    最为正式的xml schema语言是由w3c指定的xml schema规范,简称为xsd(xml schema definition)。xsd也提供了数据类型的支持和结构定义的方法。

     

    2001年5月2日,Xml schema 规范成为了w3c的正式推荐标准。这就意味着经过三年多的发展,xml 的schema标准终于修成了正果。这样,xml、xml schema和namespace都成为了w3c的正式,这是一个值得庆贺的历史性时刻,意味着xml语法的规范已经奠定了扎实的基础。xml的广泛发展和应用也即将成为现实。下面我们就将重点来介绍最新的xml schema标准。

  • xml schema的全貌

     

    我们用实际的例子来介绍xml schema的用法。比如,有这样的xml实例文档:

    <?xml version="1.0" encoding="gb2312"?>
    <!doctype studentlst system "student.dtd">
    <studentlst>
    <student>
    <name>至尊宝</name>
    <genda>男</genda>
    <sid>001</sid>
    <birthday>1576-3-2</birthday>
    </student>
    <student>
    <name>白晶晶</name>
    <genda>女</genda>
    <sid>002</sid>
    <birthday>1578-4-25</birthday>
    </student>
    </studentlst>

    该文档用dtd定义如下:

    <?xml version="1.0" encoding="utf-8"?>
    <!element studentlst (student)*>
    <!element student (name, genda, sid, birthday)>
    <!element name (#pcdata)>
    <!element genda (#pcdata)>
    <!element sid (#pcdata)>
    <!element birthday (#pcdata)>


    但是其中name和genda、sid等文本元素的数据类型都是统一的字符类型,而事实上我们一般要求对它们有更为严格的限制。比如,要求name仍然为字符类型,而genda为可选的枚举类型,只能取男或女,sid要求是三位的整数类型,并且要求birthday为日期类型。name和birthday的定义比较简单:

    <element name="name" type="string" minoccurs="1" maxoccurs="1/">
    <element name="birthday" type="date" minoccurs="1" maxoccurs="1/">

    其中string和date类型都是schema中自带的基本数据类型(primary data type)。minoccurs和maxoccurs是最少和最多出现次数,这里是表示有而且只出现一次。这是最简单的元素声明。在xml schema中提供两种数据类型:一是我们刚刚接触的基本数据类型或者称为内建数据类型;另外一种是扩展的数据类型,既在基本数据类型基础上用户自己扩展的数据类型。Schema中没有规定性别的类型,也没有直接规定三位整数的数据类型,但是性别是有男、女两种选择的枚举类型;而sid的每位都是非负整数,于是我们可以先定义两类扩展数据类型,然后来限制genda和sid元素。

    <simpletype name="gendatype">
    <restriction base="string">
    <enumeration value="男"/>
    <enumeration value="女"/>
    </restriction>
    </simpletype>

    <simpletype name="sidtype">
    <restriction base="string">
    <length value="3"/>
    <pattern value="/d{3}"/>
    </restriction>
    </simpletype>

    在定义扩展数据类型时是描述了一个simpletype元素,name属性是该数据类型的名称,数据类型由restriction子元素进行约束,该元素中的base属性是基类型,即它要扩展的基本数据类型。在枚举类型中在restriction的子元素中罗列初可选的数值;而在第二种情况时,通过对各方面(facet)进行规定来定义数据类型,比如length规定该数据类型总共有多少位数,而pattern则通过正则表达式来规定出现的方式。这里的意思是连续出现三位的整数。

    用上面定义的数据类型来约束genda和sid的方法和name和birthday元素的声明相同:

    <element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/>
    <element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/>

    有了最基本的四个文本内容的元素,如何定义作为其父元素的student元素呢?由于student元素是由子元素组成的,在Schema中称它位复杂类型的元素。而且其子元素是顺序组成的序列,因此这样声明student元素:

    <element name="student">
    <complextype>
    <sequence>
    <element name="name" type="string" minoccurs="1" maxoccurs="1"/>
    <element name="genda" type="gendatype" minoccurs="1" maxoccurs="1"/>
    <element name="sid" type="sidtype" minoccurs="1" maxoccurs="1"/>
    <element name="birthday" type="date" minoccurs="1" maxoccurs="1"/>
    </sequence>
    </complextype>
    </element>

    另外,studentlst元素包含了student元素,并且出现的方式是一个或者多个,或者可以不出现,在schema中出现的方式可以用mioccurs和maxoccurs来表达:

    <element name="studentlst">
    <complextype>
    <sequence>
    <element name="student" minoccurs="0" maxoccurs="unbounded">
    <complextype>
    <sequence>
    <element name="name" type="string" minoccurs="1" maxoccurs="1"/>
    <element name="genda" type="gendatype" minoccurs="1" maxoccurs="1"/>
    <element name="sid" type="sidtype" minoccurs="1" maxoccurs="1"/>
    <element name="birthday" type="date" minoccurs="1" maxoccurs="1"/>
    </sequence>
    </complextype>
    </element>
    </sequence>
    </complextype>
    </element>

    最后我们将这些元素和数据类型的声明都包含在schema根元素中:

    <?xml version="1.0"?>
    <schema xmlns="http://www.w3.org/2001/xmlschema" xmlns:sl="http://www.xml.org.cn/namespaces/studentlist" targetnamespace="http://www.xml.org.cn/namespaces/studentlist">
    <element name="studentlst">
    <complextype>
    <sequence>
    <element name="student" minoccurs="0" maxoccurs="unbounded">
    <complextype>
    <sequence>
    <element name="name" type="string" minoccurs="1" maxoccurs="1"/>
    <element name="genda" type="sl:gendatype" minoccurs="1" maxoccurs="1"/>
    <element name="sid" type="sl:sidtype" minoccurs="1" maxoccurs="1"/>
    <element name="birthday" type="date" minoccurs="1" maxoccurs="1"/>
    </sequence>
    </complextype>
    </element>
    </sequence>
    </complextype>
    </element>
    <simpletype name="gendatype">
    <restriction base="string">
    <enumeration value="男"/>
    <enumeration value="女"/>
    </restriction>
    </simpletype>
    <simpletype name="sidtype">
    <restriction base="string">
    <length value="3"/>
    <pattern value="{3}"/>
    </restriction>
    </simpletype>
    </schema>

    用xsd校验xml

    由了xml schema,你可以用来校验xml文档的语义和结构。在msxml 4.0技术预览版本已经提供了用xsd schema来校验xml文档的功能。在校验文档时,将schema添加到xmlschemacache对象中,设置其 object, set the schemas property of a domdocument对象的schemas属性引用xmlschemacache对象中的schema。在将xml文档载入到domdocument对象中时将自动执行校验操作。我们不妨用例子来说明如何在visual basic中通过编程实现xml文档校验。其中包括:

    books.xsd
    用来校验books.xml文件的schema
    books.xml
    该文件将被载入并且和books.xsd对照校验
    visual basic校验代码
    创建一个xmlschemacache对象,将schema添加给它,然后设置schemas property of the domdocument对象的shemas属性。在开始的时候你要进行如下操作:
    打开visual basic 6.0,选择standard exe新项目
    在project菜单中选择references.
    在available references列表中选择microsoft xml,v4.0
    给form1添加一个command button
    存储该项目
    books.xml

    在xml编辑器甚至一般的文本编辑器中输入以下xml代码,并且存为books.xml:

    <?xml version="1.0"?>
    <x:catalog xmlns:x="urn:books">
    <book id="bk101">
    <author>gambardella, matthew</author>
    <title>xml developer's guide</title>
    <genre>computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>an in-depth look at creating applications with xml.</description>
    <title>2000-10-01</title>
    </book>
    </x:catalog>

    books.xsd

    下面是本例中使用的books.xsd schema。

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema">
    <xsd:element name="catalog" type="catalogdata"/>
    <xsd:complextype name="catalogdata">
    <xsd:sequence>
    <xsd:element name="book" type="bookdata" minoccurs="0" maxoccurs="unbounded"/>
    </xsd:sequence>
    </xsd:complextype>
    <xsd:complextype name="bookdata">
    <xsd:sequence>
    <xsd:element name="author" type="xsd:string"/>
    <xsd:element name="title" type="xsd:string"/>
    <xsd:element name="genre" type="xsd:string"/>
    <xsd:element name="price" type="xsd:float"/>
    <xsd:element name="publish_date" type="xsd:date"/>
    <xsd:element name="description" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complextype>
    </xsd:schema>

    visual basic校验代码

    你可以运行下面的例子:

    拷贝下面的代码到command1_click过程中
    private sub command1_click()
    dim xmlschema as msxml2.xmlschemacache
    set xmlschema = new msxml2.xmlschemacache
    xmlschema.add "urn:books", app.path & "/books.xsd"
    dim xmldom as msxml2.domdocument
    set xmldom = new msxml2.domdocument
    set xmldom.schemas = xmlschema

    xmldom.async = false
    xmldom.load app.path & "/books.xml"

    if xmldom.parseerror.errorcode <> 0 then
    msgbox xmldom.parseerror.errorcode & " " & xmldom.parseerror.reason
    else
    msgbox "no error"
    end if
    end sub

    执行该程序,然后点击command1按钮,将返回"no errors"消息框

    xml schema和名域

    schema是一些规则的集合(也称为语法或者语汇),其中包括了类型定义(简单和复杂类型)以及元素和属性声明。由于xml中可能存在不同的语汇来描述不同的元素和属性,因此需要使用名域(namespace)和前缀来避免元素和属性声明之间的模糊性。当你使用来自多个名域的schema时,分清元素和属性名称是最基础性的工作。

    一个名域通常有一串字符串来相互区别,如 "urn:www.microsoft.com", "http://www.xml.org.cn", "http://www.w3c.org/2001/xmlschema"以及 "uuid:1234567890"等。

    xml schema的序言

    xml schema的开头时是一些导言,之后才是正式的声明。在schema 元素的导言中可能包含三个可选的属性。

    例如,下面的语法使用的schema元素引用了三个最常使用的名域:

    <schema
    xmlns="http://www.w3c.org/2001/xmlschema" xmlns:xsd="http://www.w3c.org/2001/xmlschema-datatypes" xmlns:xsi="http://www.w3c.org/2001/xmlschema-instances"
    version"1.0">
    </schema>

    前两个属性用xml名域来标识w3c中的两个xml schema规范。第一个 xmlns属性包含了基本的xml schema元素,比如element, attribute, complextype, group, simpletype等。第二个xmlns属性定义了标准的xml schema属性类型例如string, float, integer, 等。

    缺省名域

    对于任何一个xml schema定义文档(xsd)都有一个最顶层的schema (xsd)元素。而且该schema (xsd)元素定义必须包含下面的名域:

    http://www.w3.org/2001/xmlschema

    作为名域的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。

    我们分别来观察xsd和xml实例文档中相关的名域。比如前面介绍student.xsd的序言是这样的:

    <schema xmlns="http://www.w3.org/2001/xmlschema" xmlns:sl="http://www.xml.org.cn/namespaces/studentlist" targetnamespace="http://www.xml.org.cn/namespaces/studentlist">

    这里的targetnamespace属性表示了该shema所对应的名域的uri。也就是说在引用该schema的其它文档中要声明名域,其uri应该是targetnamespace的属性值。例如在这里因为要用到student.xsd自己定义的扩展数据类型,所以也声明的名域xmlns:sl="http://www.xml.org.cn/namespaces/studentlist"。

    我们再来看由该schema规定的xml文档的开头将是什么样子:

    <studentlst xmlns="http://www.xml.org.cn/namespaces/studentlist"
    xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation="http://www.xml.org.cn/namespaces/studentlist student.xsd">

    其中缺省名域声明xmlns="http://www.xml.org.cn/namespaces/studentlist"就是和刚刚声明的xml schema的名域相结合来规定该xml文档。xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" 是任何xml实例文档固有的名域,当然按照前面所说的名域名称xsi是可以自己规定的。而xsi:schemalocation="http://www.xml.org.cn/namespaces/studentlist student.xsd"则规定了该名域所对象的schema的位置,即在相同路径的student.xsd文件。

     

    原创粉丝点击