`
xyzroundo
  • 浏览: 496615 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

XML Schema全接触 (这里主要介绍W3C的Schema标准语法)

 
阅读更多
<p>来源:<a href="http://bbs.w3china.org/dispbbs.asp?BoardID=23&amp;ID=27215&amp;ReplyID=22178&amp;skin=1">http://bbs.w3china.org/dispbbs.asp?BoardID=23&amp;ID=27215&amp;ReplyID=22178&amp;skin=1</a></p>
<p> </p>
<p>XML Schema规范
</p>
<p> </p>
<p>2001年5月2日,XML Schema 规范成为了W3C的正式推荐标准。经过三年多的发展,XML 的Schema标准终于修成了正果。这样,XML、XML Schema和Namespace都成为了W3C的正式标准,这是一个值得庆贺的历史性时刻,意味着XML语法的规范已经奠定了扎实的基础,XML的广泛发展和应用也即将成为现实。这里将介绍XML定义语言、XML Schema全貌和XML Schema如何校验XML文档。</p>
<p>XML定义语言:DTD,XDR和XSD</p>
<p>我们知道XML文档有结构良好和有效性两种约束。格式良好适合于所有的XML文档,即满足XML标准中对于格式的规定。而当XML文档满足一定的语义约束则称该XML文档为有效的XML文档。目前常用的XML定义语言有DTD,XDR和XSD。</p>
<p>文档类型定义(DTD)</p>
<p>文档类型定义用不同于XML的独立语法来规定了XML文档中各种元素集合的内容模式。该语言直接沿袭了定义SGML语言的方法,这样做的好处是如下:</p>
<p>DTD使得XML文档保持一致<br>DTD可以共享<br>DTD提供了对XML语汇的形式化和完整的定义<br>每个XML文档有单个的DTD来限制</p>
<p>Schema</p>
<p>类似DTD,Schema可以规定一套特定文档的结构或模型。使用Schema语言来描述文档结构有下面以下好处:<br>Schema使用的是XML语法<br>Schema可以用XML解析器来解析<br>Schema允许全局性元素(在整个XML文档中元素用相同方式来使用)和局部性元素(元素在特定的上下文中有不同的含义)<br>Schema提供丰富的数据类型(如整型、布尔型、日期类型等);而且一个元素中的数据类型可以进行规定,甚至可以根据需要自定义数据类型</p>
<p>XDR</p>
<p>XDR的全称是XML-Data Reduced Language,是早先由XML-Data草案派生出来的一个定义XML语言的分支。由于微软最先提出了XML-Data,并且经过修订后在其软件中应用,所以XDR也被广泛使用。目前支持XDR Schema的产品有:</p>
<p>Microsoft Biztalk Server<br>Microsoft SQL Server 2000<br>Microsoft Office 2000<br>Microsoft IE5.0和后续版本<br>XDR也得到了Extensibility的 XML Authority编辑工具的支持。</p>
<p>XSD Schema</p>
<p>最为正式的XML Schema语言是由W3C指定的XML Schema规范,简称为XSD(XML Schema Definition)。XSD也提供了数据类型的支持和结构定义的方法。</p>
<p>2001年5月2日,XML Schema 规范成为了W3C的正式推荐标准。这就意味着经过三年多的发展,XML 的Schema标准终于修成了正果。这样,XML、XML Schema和Namespace都成为了W3C的正式,这是一个值得庆贺的历史性时刻,意味着XML语法的规范已经奠定了扎实的基础。XML的广泛发展和应用也即将成为现实。下面我们就将重点来介绍最新的XML Schema标准。</p>
<p>我们用实际的例子来介绍XML Schema的用法。比如,有这样的XML实例文档:</p>
<p>&lt;?xml version="1.0" encoding="GB18030"?&gt;<br>&lt;studentlst&gt;<br>&lt;student&gt;<br>&lt;name&gt;至尊宝&lt;/name&gt;<br>&lt;genda&gt;男&lt;/genda&gt;<br>&lt;sid&gt;001&lt;/sid&gt;<br>&lt;birthday&gt;1576-3-2&lt;/birthday&gt;<br>&lt;/student&gt;<br>&lt;student&gt;<br>&lt;name&gt;白晶晶&lt;/name&gt;<br>&lt;genda&gt;女&lt;/genda&gt;<br>&lt;sid&gt;002&lt;/sid&gt;<br>&lt;birthday&gt;1578-4-25&lt;/birthday&gt;<br>&lt;/student&gt;<br>&lt;/studentlst&gt;</p>
<p>但是其中name和genda、sid等文本元素的数据类型都是统一的字符类型,而事实上我们一般要求对它们有更为严格的限制。比如,要求name仍然为字符类型,而genda为可选的枚举类型,只能取男或女,sid要求是三位的整数类型,并且要求birthday为日期类型。name和birthday的定义比较简单:</p>
<p>&lt;element name="name" type="string" minOccurs="1" maxOccurs="1" /&gt;<br>&lt;element name="birthday" type="date" minOccurs="1" maxOccurs="1"/&gt;</p>
<p>其中string和date类型都是Schema中自带的基本数据类型(Primary Data Type)。minOccurs和maxOccurs是最少和最多出现次数,这里是表示有而且只出现一次。这是最简单的元素声明。在XML Schema中提供两种数据类型:一是我们刚刚接触的基本数据类型或者称为内建数据类型;另外一种是扩展的数据类型,既在基本数据类型基础上用户自己扩展的数据类型。Schema中没有规定性别的类型,也没有直接规定三位整数的数据类型,但是性别是有男、女两种选择的枚举类型;而sid的每位都是非负整数,于是我们可以先定义两类扩展数据类型,然后来限制genda和sid元素。</p>
<p>&lt;simpleType name="GendaType"&gt;<br>&lt;restriction base="string"&gt;<br>&lt;enumeration value="男"/&gt;<br>&lt;enumeration value="女"/&gt;<br>&lt;/restriction&gt;<br>&lt;/simpleType&gt;<br>&lt;simpleType name="SIDType"&gt;<br>&lt;restriction base="string"&gt;<br>&lt;length value="3"/&gt;<br>&lt;pattern value="/d{3}"/&gt;<br>&lt;/restriction&gt;<br>&lt;/simpleType&gt;</p>
<p>在定义扩展数据类型时是描述了一个simpleType元素,name属性是该数据类型的名称,数据类型由restriction子元素进行约束,该元素中的base属性是基类型,即它要扩展的基本数据类型。在枚举类型中在restriction的子元素中罗列初可选的数值;而在第二种情况时,通过对各方面(facet)进行规定来定义数据类型,比如length规定该数据类型总共有多少位数,而pattern则通过正则表达式来规定出现的方式。这里的意思是连续出现三位的整数。</p>
<p>用上面定义的数据类型来约束genda和sid的方法和name和birthday元素的声明相同:</p>
<p>&lt;element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/&gt;</p>
<p>有了最基本的四个文本内容的元素,如何定义作为其父元素的student元素呢?由于student元素是由子元素组成的,在Schema中称它位复杂类型的元素。而且其子元素是顺序组成的序列,因此这样声明student元素:</p>
<p>&lt;element name="student"&gt;<br>&lt;complexType&gt;<br>&lt;sequence&gt;<br>&lt;element name="name" type="string" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="birthday" type="date" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;/sequence&gt;<br>&lt;/complexType&gt;<br>&lt;/element&gt;</p>
<p>另外,studentlst元素包含了student元素,并且出现的方式是一个或者多个,或者可以不出现,在Schema中出现的方式可以用miOccurs和maxOccurs来表达:</p>
<p>&lt;element name="studentlst"&gt;<br>&lt;complexType&gt;<br>&lt;sequence&gt;<br>&lt;element name="student" minOccurs="0" maxOccurs="unbounded"&gt;<br>&lt;complexType&gt;<br>&lt;sequence&gt;<br>&lt;element name="name" type="string" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="genda" type="GendaType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="sid" type="SIDType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="birthday" type="date" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;sequence&gt;<br>&lt;complexType&gt;<br>&lt;element&gt;<br>&lt;sequence&gt;<br>&lt;complexType&gt;<br>&lt;element&gt;</p>
<p>最后我们将这些元素和数据类型的声明都包含在schema根元素中:</p>
<p>&lt;?xml version="1.0" encoding="GB18030"?&gt;<br>&lt;schema xmlns="<a class="contentlink" href="http://www.w3.org/2001/XMLSchema%22" target="_blank">http://www.w3.org/2001/XMLSchema"</a> xmlns:sl="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22" target="_blank">http://www.xml.org.cn/namespaces/StudentList"</a> targetNamespace="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22%3E" target="_blank">http://www.xml.org.cn/namespaces/StudentList"&gt;</a><br>&lt;element name="studentlst"&gt;<br>&lt;complexType&gt;<br>&lt;sequence&gt;<br>&lt;element name="student" minOccurs="0" maxOccurs="unbounded"&gt;<br>&lt;complexType&gt;<br>&lt;sequence&gt;<br>&lt;element name="name" type="string" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="genda" type="sl:GendaType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="sid" type="sl:SIDType" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;element name="birthday" type="date" minOccurs="1" maxOccurs="1"/&gt;<br>&lt;/sequence&gt;<br>&lt;/complexType&gt;<br>&lt;/element&gt;<br>&lt;/sequence&gt;<br>&lt;/complexType&gt;<br>&lt;/element&gt;<br>&lt;simpleType name="GendaType"&gt;<br>&lt;restriction base="string"&gt;<br>&lt;enumeration value="男"/&gt;<br>&lt;enumeration value="女"/&gt;<br>&lt;/restriction&gt;<br>&lt;/simpleType&gt;<br>&lt;simpleType name="SIDType"&gt;<br>&lt;restriction base="string"&gt;<br>&lt;length value="3"/&gt;<br>&lt;pattern value="{3}"/&gt;<br>&lt;/restriction&gt;<br>&lt;/simpleType&gt;<br>&lt;/schema&gt;</p>
<p>用XSD校验XML</p>
<p>由了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文档校验。其中包括:</p>
<p>books.xsd<br>用来校验books.xml文件的Schema<br>books.xml<br>该文件将被载入并且和books.xsd对照校验<br>Visual Basic校验代码<br>创建一个XMLSchemaCache对象,将schema添加给它,然后设置schemas property of the DOMDocument对象的shemas属性。在开始的时候你要进行如下操作:<br>打开Visual Basic 6.0,选择Standard EXE新项目<br>在Project菜单中选择References.<br>在Available References列表中选择Microsoft XML,v4.0<br>给Form1添加一个Command button<br>存储该项目<br>books.xml</p>
<p>在XML编辑器甚至一般的文本编辑器中输入以下XML代码,并且存为books.xml:</p>
<p>&lt;?xml version="1.0" encoding= "GB18030"?&gt;<br>&lt;x:catalog xmlns:x="urn:books"&gt;<br>&lt;book id="bk101"&gt;<br>&lt;author&gt;Gambardella, Matthew&lt;/author&gt;<br>&lt;title&gt;XML Developer's Guide&lt;/title&gt;<br>&lt;genre&gt;Computer&lt;/genre&gt;<br>&lt;price&gt;44.95&lt;/price&gt;<br>&lt;publish_date&gt;2000-10-01&lt;/&lt; font&gt;publish_date&gt;<br>&lt;description&gt;An in-depth look at creating applications with XML.&lt;/description&gt;<br>&lt; title&gt;2000-10-01&lt;/&lt; font&gt;title&gt;<br>&lt;/book&gt;<br>&lt;/x:catalog&gt;</p>
<p>books.xsd</p>
<p>下面是本例中使用的books.xsd schema。</p>
<p>&lt;xsd:schema xmlns:xsd="<a class="contentlink" href="http://www.w3.org/2001/XMLSchema%22%3E" target="_blank">http://www.w3.org/2001/XMLSchema"&gt;</a><br>&lt;xsd:element name="catalog" type="CatalogData"/&gt;<br>&lt;xsd:complexType name="CatalogData"&gt;<br>&lt;xsd:sequence&gt;<br>&lt;xsd:element name="book" type="bookdata" minOccurs="0" maxOccurs="unbounded"/&gt;<br>&lt;/xsd:sequence&gt;<br>&lt;/xsd:complexType&gt;<br>&lt;xsd:complexType name="bookdata"&gt;<br>&lt;xsd:sequence&gt;<br>&lt;xsd:element name="author" type="xsd:string"/&gt;<br>&lt;xsd:element name="title" type="xsd:string"/&gt;<br>&lt;xsd:element name="genre" type="xsd:string"/&gt;<br>&lt;xsd:element name="price" type="xsd:float"/&gt;<br>&lt;xsd:element name="publish_date" type="xsd:date"/&gt;<br>&lt;xsd:element name="description" type="xsd:string"/&gt;<br>&lt;/xsd:sequence&gt;<br>&lt;xsd:attribute name="id" type="xsd:string"/&gt;<br>&lt;/xsd:complexType&gt;<br>&lt;/xsd:schema&gt;</p>
<p>XML Schema和名域</p>
<p>Schema是一些规则的集合(也称为语法或者语汇),其中包括了类型定义(简单和复杂类型)以及元素和属性声明。由于XML中可能存在不同的语汇来描述不同的元素和属性,因此需要使用名域(namespace)和前缀来避免元素和属性声明之间的模糊性。当你使用来自多个名域的schema时,分清元素和属性名称是最基础性的工作。</p>
<p>一个名域通常有一串字符串来相互区别,如 "urn:www.microsoft.com", "<a class="contentlink" href="http://www.xml.org.cn%22/" target="_blank">http://www.xml.org.cn"</a>, "<a class="contentlink" href="http://www.w3c.org/2001/XMLSchema%22" target="_blank">http://www.w3c.org/2001/XMLSchema"</a>以及 "uuid:1234567890"等。</p>
<p>XML Schema的序言</p>
<p>XML schema的开头时是一些导言,之后才是正式的声明。在schema 元素的导言中可能包含三个可选的属性。</p>
<p>例如,下面的语法使用的schema元素引用了三个最常使用的名域:</p>
<p>xmlns="<a class="contentlink" href="http://www.w3c.org/2001/XMLSchema%22" target="_blank">http://www.w3c.org/2001/XMLSchema"</a> xmlns:xsd="<a class="contentlink" href="http://www.w3c.org/2001/XMLSchema-datatypes%22" target="_blank">http://www.w3c.org/2001/XMLSchema-datatypes"</a> xmlns:xsi="<a class="contentlink" href="http://www.w3c.org/2001/XMLSchema-instances%22" target="_blank">http://www.w3c.org/2001/XMLSchema-instances"</a><br>version"1.0"&gt;</p>
<p><br>前两个属性用XML名域来标识W3C中的两个XML schema规范。第一个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。第二个xmlns属性定义了标准的XML schema属性类型例如string, float, integer, 等。</p>
<p>缺省名域</p>
<p>对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含下面的名域:</p>
<p><a class="contentlink" href="http://www.w3.org/2001/XMLSchema" target="_blank">http://www.w3.org/2001/XMLSchema</a></p>
<p>作为名域的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。</p>
<p>我们分别来观察XSD和XML实例文档中相关的名域。比如前面介绍student.xsd的序言是这样的:</p>
<p>&lt; schema xmlns="<a class="contentlink" href="http://www.w3.org/2001/XMLSchema%22" target="_blank">http://www.w3.org/2001/XMLSchema"</a> xmlns:sl="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22" target="_blank">http://www.xml.org.cn/namespaces/StudentList"</a> targetNamespace="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22%3E" target="_blank">http://www.xml.org.cn/namespaces/StudentList"&gt;</a></p>
<p>这里的targetNamespace属性表示了该shema所对应的名域的URI。也就是说在引用该Schema的其它文档中要声明名域,其URI应该是targetNamespace的属性值。例如在这里因为要用到student.xsd自己定义的扩展数据类型,所以也声明的名域xmlns:sl="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22" target="_blank">http://www.xml.org.cn/namespaces/StudentList"</a>。</p>
<p>我们再来看由该schema规定的XML文档的开头将是什么样子:</p>
<p>&lt;studentlst xmlns="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22" target="_blank">http://www.xml.org.cn/namespaces/StudentList"</a><br>xmlns:xsi="<a class="contentlink" href="http://www.w3.org/2001/XMLSchema-instance%22" target="_blank">http://www.w3.org/2001/XMLSchema-instance"</a><br>xsi:schemaLocation="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList" target="_blank">http://www.xml.org.cn/namespaces/StudentList</a> student.xsd"&gt;</p>
<p>其中缺省名域声明xmlns="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList%22" target="_blank">http://www.xml.org.cn/namespaces/StudentList"</a>就是和刚刚声明的XML Schema的名域相结合来规定该XML文档。<br>xmlns:xsi="<a class="contentlink" href="http://www.w3.org/2001/XMLSchema-instance%22" target="_blank">http://www.w3.org/2001/XMLSchema-instance"</a> 是任何XML实例文档固有的名域,当然按照前面所说的名域名称xsi是可以自己规定的。而xsi:schemaLocation="<a class="contentlink" href="http://www.xml.org.cn/namespaces/StudentList" target="_blank">http://www.xml.org.cn/namespaces/StudentList</a> student.xsd"则规定了该名域所对象的schema的位置,即在相同路径的student.xsd文件。</p>
分享到:
评论

相关推荐

    XML Schema简明教程-W3C.rar

    XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 在此教程中,你将学习如何在应用程序中读取和创建 XML ...

    W3C XML Schema

    Description of the W3C XML Schema.

    一个简单的XML Schema的例子

    Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。...Schema 的概念提出已久,但W3C的标准最近才出来,相应的应用支持尚未完善,但采用Schema已成为XML发展的一个趋势。

    W3C_xml-schema.zip

    xml-schema.zip W3C的XML schema教程

    W3C school XML schema中文教程

    W3C school XML schema中文教程,主页为*/schema/index.html

    W3C XML Schema 模式的设计方法研究.pdfW3C XML Schema 模式的设计方法研究.pdf

    W3C XML Schema 模式的设计方法研究.pdfW3C XML Schema 模式的设计方法研究.pdf

    Java通过XML Schema校验XML

     W3C这块的XML相关的规范相当的多,这也是导致XML处理器起来费劲的主要原因。要想精通这些规范和相关的API,实在是异想天开(新的规范在不停出,越来越多!)。  校验的原理是通过读取解析XML的时候设置校验的XSD...

    XML+Schema中文教程

    w3c XML Schema 中文教程CHM文档

    W3C XML Schema 活动

    W3C XML Schema 活动 XML Schema 是基于 XML 的 DTD 替代物。 XML Schema 教程 如需学习更多有关 XML Schema 的知识,请阅读我们的 XML Schema 教程。 XML Schema XML 1.0 支持可定义文档结构的 DTD。 XML Schema...

    使用XML Schema定义元素的基本知识

    新的XML Schema系统即将成为W3C推荐标准,目的是为了克服DTD的局限性,为XML文档提供丰富的语法结构。本文展示了模式的灵活性,说明如何使用XML Schema系统来定义最基本的XML文档构造块——元素。XML Schema比DTD更...

    XML Schema教程

    关于XML Schema的全面教程,是从http://www.w3school.com.cn/里面挖来的,一定要看看。原版的

    W3C教程(8):W3C XML Schema 活动

    XML Schema 是基于 XML 的 DTD 替代物。 XML Schema 是基于 XML 的 DTD 替代物。 XML 教程 如需学习更多有关 XML Schema 的知识,请阅读我们的 XML Schema 教程。 XML Schema XML 1.0 支持可定义文档结构的 DTD。 ...

    XML_SCHEMA教程

    XML SCHEMA教程 比较详细,XML Schema是W3C制定的基于XML格式的XML文档结构描述标准。作为一种文档描述语言,通常我们将其简写为XSD(XML Schema Define)。XSD作为DTD(文档类型定义)的替代者,已经广泛地应用到...

    XML Schema官方资料

    自己从W3C Schema官方站点上面载下来的,分三章,全为英文版。还有官方的dtd文件和schema文件

    W3C 教程

    W3C 教程 W3C 让每个人都能在互联网上分享资源。 开始学习 W3C ! W3C 教程列表 W3C 简介 本节内容:W3C 是什么组织,它如何运作,网络是如何被标准化的。 W3C 过程 ...本节总结了 W3C 的 XML Schema 活动

    XML转XSD\DTD工具

    XML转XSD\DTD工具 W3C XML Schema XSD 工具

    XPath over XML Schema-开源

    根据W3C XML Schema定义评估XPath 1.0表达式,以获取将在运行时匹配的节点的编译时预测。 项目主页:http://xpath-on-schema.sourceforge.net/

    X.694-Mapping W3C XML Schema Definitions into ASN.1

    ASN.1的正式标准文档和它的编码规则由 International Telecommunications Union Telecommunications Sector (ITU-T)和International Standards Organization (ISO) / International Electrotechnical Commission ...

Global site tag (gtag.js) - Google Analytics