📄 schem~%3.htm
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<TITLE>理解XML Schema</TITLE>
<style type="text/css">
<!--
.normal10 { font-size: 11pt}
.normal9 { font-size: 9pt}
p{ font-size: 9pt}
a{ text-decoration: none }
a:hover{ color:Red;text-decoration:underline }
a {
font-size:9pt;
COLOR: cornflowerblue;
FONT-FAMILY: "新细明体", "宋体";
FONT-WEIGHT: bold
}
-->
</style>
<link rel="stylesheet" href="../../Global.css" tppabs="http://www.xml.org.cn:8188/Global.css"></HEAD>
<BODY>
<p ALIGN="CENTER">[<a href="../../default.asp" tppabs="http://www.xml.org.cn:8188/default.asp">返回首页</a>][<a href="../resource.htm" tppabs="http://www.xml.org.cn:8188/resource/resource.htm">返回资源</a>]</p>
<table width="85%" border="0" align="center">
<tr>
<td width="22%" height="30"> </td>
<td width="53%" height="30">
<h2 align="center"><font color="#6633FF"><b><font color="#0000FF">理解XML
Schema</font></b></font></h2>
<p align="center">最后更新:1999年8月4日 作者:<a href="mailto:xyuhua@hotmail.com">郁桦</a></p>
</td>
<td width="25%" height="30"><a name="top"></a></td>
</tr>
<tr>
<td colspan="3" height="5231">
<h4 align="left"><a name="1"></a>什么是Schema</h4>
<p align="left" class="normal105">Schema 是一种描述信息结构的模型.它是借用数据库中一种描述相关表格内容的机制.它为一类文件树立了一个模式.这个模式规范了文件中tag(标签)和文本可能的组合形式.
<br>
<br>
我们还是来举一个例子吧: 假设我要知道什么是一个valid (合法的)邮政地址. </p>
<div align="left">
<pre class="programlisting">
<tt><span class="normal105"><address></span></tt>
<span class="normal105"><tt><name></tt>Namron H. Slaw<tt></name></tt>
<tt><street></tt>256 Eight Bit Lane<tt></street></tt>
<tt><city></tt>East Yahoo<tt></city></tt>
<tt><state></tt>MA<tt></state></tt>
<tt><zip></tt>12481-6326<tt></zip></tt>
<tt></address></tt>
</span></pre>
</div>
<p align="left"><span class="normal105">当我们人自己判断时,实际上也是在经过一个Schema的检查.大致的过程是这样的:
一个邮政地址包括一个人名, 一个公司或组织名;一行或多行地址; 一个城市名; 一个省区名;一个邮政编码;还可以有选择的加上一个国家名.依照这个标准,上面的邮政地址是valid
(合法的). 在Schema中规范了两种限制.一种是内容模式限制,用来规定文件中element (元素)的顺序.另 一种是数据类型限制,用来限制数据单元的合法性.
<br>
<br>
就上面的例子, Schema要规定一个合法的<address>必须包括一个<name><name>元素;一个或多个<street><street>元素;有且仅有一个<city><city>,<state>和<zip>元素.<zip><zip>元素还要加上其他的限制.它必须是连续的五位数字或是在连续的五位数字后加连字符,在接连续的四位数字.
Schema的目的就是让机器识别什么是正确的邮政地址.只要文件通过了Schema的检查,它就是valid (合法的). 比如下面的邮政地址是非法的:</span></p>
<div align="left">
<pre class="programlisting">
<span class="normal105"><tt><address></tt>
<tt><name></tt>Namron H. Slaw<tt></name></tt>
<tt><street></tt>256 Eight Bit Lane<tt></street></tt>
<tt><city></tt>East Yahoo<tt></city></tt>
<tt><state></tt>MA<tt></state></tt>
<tt><state></tt>CT<tt></state></tt>
<tt><zip></tt>blue<tt></zip></tt>
<tt></address></tt>
</span></pre>
</div>
<p align="left"><span class="normal105">它<span class="normal105">违反了两条限制:第一,它没有包括一个<state><state>.第二,<zip><zip>的内容形式不对.
Schema能检查出这些错误.这对于网上数据交换是非常必要的.不</span>符合一定标准的数据可以不被接受..</span></p>
<h4 align="left"><a name="2"></a>DTD</h4>
<p align="left"><span class="normal105">DTD是SGML中的Schema机制.XML从SGML处继承了这一技术,并加以发展.
XML是第一次人们试图改变DTD.DTD的功用很多:定义内容模式;限制范围,属性的数据类型.但它也有着缺陷:它本身不是用XML书写的;而且它不支持namespaces(名域).
DTD之提供了非常有限的几种数据类型.更重要的是它不能表达元素中字符数据的数据类型. DTD有扩展的机制,但这个机制太复杂而且很脆弱. DTD扩展的机制的最大毛病在于不能清楚的表达相互之间的关系.两个有着完全相同内容的元素怎么做也不能互相联系.同样的,一组被定义为参数体(parameter
entity)的属性(attribute)之间不能建立任何联系. XML的 Schema打破了这些限制.它能更加清晰的表现信息之间的内容.
虽然我们说XML的 Schema将代替DTD,但在短期内DTD 还是有着它的优势的: </span></p>
<div align="left">
<ul>
<li>
<p align="left"><span class="normal105">广泛的工具支持.所有的SGML和许多XML工具都支持DTD.</span></p>
</li>
</ul>
</div>
<ul>
<li>
<p align="left"><span class="normal105">广泛的应用.有很多文件形式都支持. </span></p>
</li>
<li>
<p align="left"><span class="normal105">广泛的经验. DTD一应用多年,在实践中人们已积累了许多宝贵的经验.
</span></p>
</li>
</ul>
<h4 align="left"><a name="3"></a>XML Schema的新特色</h4>
<p align="left"><span class="normal105">XML Schema 提供了一系列的新特色. </span></p>
<div align="left">
<ul>
<li>
<p align="left"><span class="normal105">丰富的数据类型.它们包括:布尔型,数字,日期时间,
URIs整数,十进制数,市属,时间间隔,等等.而且他还支持由这些简单的类型生成复杂的类型. </span></p>
</li>
</ul>
</div>
<ul>
<li>
<p align="left"><span class="normal105">由有用户定义的数据类型被称为Archetypes(原型).比方树,您可以先定义"PostalAddress"这个数据类型,然后定义"ShippingAddress"
和"BillingAddress"是这个类型的两个元素. </span></p>
</li>
<li>
<p align="left"><span class="normal105">属性(Attribute)分组.属性的应用范围是多种多样的.有的是所有元素都有的,有的是专门为图形元素设定的.为了表明这些关系,在DTD中我们是用参数体实现的..
</span></p>
</li>
<li>
<p align="left"><span class="normal105">可修改的archetypes(原型).这是最重要的特色.
DTD定义的内容模式是封闭的,而XML Schema定义的是开放的,可修改的. </span></p>
</li>
<li>
<p><span class="normal105">Namespace(名域)的支持.自从XML引入了Namespace,合法性的检查就变得复杂了.在XML完全开发之前,这个问题很难有完满的解决.
</span> </p>
</li>
</ul>
<h4><a name="4"></a>合法性</h4>
<p align="left"><span class="normal105">文件是合法的是指它符合规定的文件模式. 比如说当您在从事电子商务时,您希望您能收到完全规范的信息.检查文件的合法性就能做到这一点.您和您的合作伙伴之间要共享数据,而你们之间的数据库是不一样的.当他把数据用XML发送过来时,您可以检查文件的合法性.这当然不是人来完成的.
检查文件的合法性可以防止不良数据的混入. 检查文件的合法性还可以使得您在一次性处理大量文件时高枕无忧,不必担心中途出错. 顺便提一下, 合法的文件仍然又可以是语义错误的.比如说您的订单只要十个,而文件中给您一百个.
</span></p>
<p align="left"><span class="normal105">对您可能接触到的文件,我们可以分成以下三类: <br>
1. 不是结构完整(well-formed)的.这样的文件不能成为XML文件. <br>
2.如果文件不能满足schema的要求, 那么这个文件是结构完整(well-formed)的,但却是非法的. <br>
3.如果文件完全满足schema的要求, 那么这个文件是结构完整(well-formed)的,而且是合法的. </span></p>
<p align="left"><span class="normal105">Schema可检查的合法性有两种: </span></p>
<p align="left"><span class="normal105">1.内容模式合法. <br>
内容模式合法性是检查文件内标签的顺序和元素的内嵌是否合法. 那我们上面的例子来说, 一个合法的<address>必须包括一个<name><name>元素;一个或多个<street><street>元素;一个而且仅有一个<city><city>,<state>和<zip>元素,还可以有选择的加上一个<country><country>国家名.那么XML
Schema 中应该这样来描述:</span></p>
<div align="left">
<pre align="left"><span class="normal105"><elementType name="address">
<sequence>
<elementTypeRef name="name" minOccur="1" maxOccur="1"/>
<elementTypeRef name="street" minOccur="1" maxOccur="2"/>
<elementTypeRef name="city" minOccur="1" maxOccur="1"/>
<elementTypeRef name="state" minOccur="1" maxOccur="1"/>
<elementTypeRef name="zip" minOccur="1" maxOccur="1"/>
<elementTypeRef name="country" minOccur="0" maxOccur="1"/>
</sequence>
</elementType>
</span></pre>
</div>
<div id="cmvalid" class="section" align="left">
<p align="left"><span class="normal105">2.数据类型合法<br>
<br>
数据单元合法性是指特定的某些信息单元是否有正确的类型,或是是否有合法的数值. 还是上面的例子. <zip>元素的数值不能是blue.</span></p>
<h4 align="left"><font face="宋体" lang="ZH-CN" size="3">语法</font></h4>
<p align="JUSTIFY"><span class="normal105">XML Schema<font lang="ZH-CN">文件也是</font>XML<font lang="ZH-CN">文件</font>,<font lang="ZH-CN">这允许</font>Schema<font lang="ZH-CN">文件同被它检查的文件一样用同样的工具处理</font>.<font lang="ZH-CN">下面我们来举几个例子</font>.</span></p>
<p align="JUSTIFY"><span class="normal105"><font lang="ZH-CN">例一</font>.<font lang="ZH-CN">元素类型的名称</font>.</span></p>
<pre align="JUSTIFY"><span class="normal105"><font size="3"><elementType name="name">
<mixed/>
</elementType></font></span></pre>
<p align="JUSTIFY"><span class="normal105"><font lang="ZH-CN">值得指出的是</font>,<font lang="ZH-CN">这里我们用了</font>element
type(<font lang="ZH-CN">元素类型</font>),<font lang="ZH-CN">而不是</font>element(<font lang="ZH-CN">元素</font>).<font lang="ZH-CN">这是为了区分的方便</font>.<elementType><font lang="ZH-CN">元素的内容规定了这种元素类型的合法值</font>.<font lang="ZH-CN">在这个例子里</font>,<font lang="ZH-CN">是</font><mixed/>.<font lang="ZH-CN">这是指元素可以包括字符数据和元素的混合</font>.</span></p>
<p align="JUSTIFY"><span class="normal105"><font lang="ZH-CN">我们可以从下面</font>zipCode(<font lang="ZH-CN">邮政编码</font>)<font lang="ZH-CN">数据类型的定义中体会例一</font>.zipCode<font lang="ZH-CN">数据类型是一个字符串</font>.
<font lang="ZH-CN">它必须是连续的五位数字或是在连续的五位数字后加连字符</font>,<font lang="ZH-CN">再接连续的四位数字</font>.</span></p>
<p align="JUSTIFY"><span class="normal105"><font lang="ZH-CN">例二</font>.
<font lang="ZH-CN">邮政编码数据类型</font>.</span></p>
<pre align="JUSTIFY"><span class="normal105"><datatype name="zipCode">
<basetype name="string"/>
<lexicalRepresentation>
<lexical>99999</lexical>
<lexical>99999-9999</lexical>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -