---------------------- android培训、java培训、期待与您交流!----------------------
Schema文件的DTD表示
<!ENTITY % datatypes "(entity | entities | enumeration | id | idref | idrefs | nmtoken | nmtokens | notation | string | bin.base64 | bin.hex | boolean | char | date | dateTime | dateTime.tz | fixed.14.4 | float | int | number | time | time.tz | i1 | i2 | i4 | r4 | r8 | ui1 | ui2 | ui4 | uri | uuid)"
>
<!-- *** 数据类型 **** -->
<!ELEMENT datatype (description)*>
<!ATTLIST datatype
dt:type %datatypes; #IMPLIED
xmlns:dt CDATA #FIXED "urn:schemas-microsoft-com:datatypes"
>
<!-- ***** 描述 ***** -->
<!ELEMENT description (#PCDATA) >
<!-- **** 元素引用 ***** -->
<!--附加限制: maxOccurs 必须是 1 or "*" -->
<!ELEMENT element (description)* >
<!ATTLIST element
type IDREF #REQUIRED
minOccurs CDATA #IMPLIED
maxOccurs CDATA #IMPLIED
>
<!-- **** 属性引用 ***** -->
<!ELEMENT attribute (description)* >
<!ATTLIST attribute
type IDREF #REQUIRED
default CDATA #IMPLIED
required (yes | no) "no"
>
<!-- **** 属性定义 ***** -->
<!ELEMENT AttributeType (datatype | description)* >
<!ATTLIST AttributeType
name ID #REQUIRED
default CDATA #IMPLIED
dt:type %datatypes; #IMPLIED
dt:values CDATA #IMPLIED
required (yes | no) #IMPLIED
xmlns:dt CDATA #FIXED "urn:schemas-microsoft-com:datatypes"
>
<!-- **** 元素定义 ***** -->
<!ELEMENT ElementType (datatype | description | AttributeType | attribute | element | group)* >
<!ATTLIST ElementType
name ID #REQUIRED
model (open | closed) #IMPLIED
content (empty | textOnly | eltOnly | mixed) #IMPLIED
order (one | seq | many) #IMPLIED
dt:type %datatypes; #IMPLIED
dt:values CDATA #IMPLIED
required (yes | no) #IMPLIED
xmlns:dt CDATA #FIXED "urn:schemas-microsoft-com:datatypes"
>
<!-- **** 分组 ***** -->
<!ELEMENT group (group | element | description)*>
<!ATTLIST group
minOccurs CDATA #IMPLIED
maxOccurs CDATA #IMPLIED
order (one | seq | many) #IMPLIED
>
<!-- **** Schema ***** -->
<!ELEMENT Schema (AttributeType | ElementType | description )* >
<!ATTLIST Schema
name CDATA #IMPLIED
xmlns:dt CDATA #FIXED "urn:schemas-microsoft-com:datatypes"
>
这里所讲的Schema的实现语法都是按照微软Internet Explorer 5.0所提供的支持。这个语法主要综合了W3C的两个Note:规范XML-Data (http://www.w3.org/TR/1998/NOTE-XML-data-0105/ )和文档内容描述DCD (http://www.w3.org/TR/NOTE-dcd ),并加入一些扩展
Schema 文件的结构
在说到元素的定义方法之前,我们先来讲一下Schema文件的结构。其实,Schema文件和其它XML文件的样子非常相似,它是由一组元素构成的,其根元素是“Schema”。“Schema”元素是XML Schema中第一个出现的元素,用于表明该XML文档是一个Schema文档,相应的,“Schema”的结束标记一般在文档的末尾。这样,一个Schema的结构如下:
<Schema name="schema-name" xmlns="namespace" > ... </Schema> |
Schema具有两个属性:name指定该Schema的名称,而xmlns则指定该Schema包含的命名空间。注意,一个XML Schema文档中可以包含多个命名空间,比如下面的语句指定了三个命名空间:
<Schema name="mySchema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:myNS=http://www.xml_step_by_step.edu\ns.xml > |
第一个是xmlns="urn:schemas-microsoft-com:xml-data",它指定本文档是一个XML Schema文档;第二个是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定义了在本文档中可以使用的数据类型;第三个是xmlns:myNS="http://www.xml_step_by_step.edu\ns.xml",它表明下面可能会用到在myNS中定义的元素或属性。
用Schema定义元素及其内容
在讲述Schema中和ETD定义相对应的种种定义方法之前,我们先来看看所涉及的三个Schema元素:ElementType、element、group。
在Schema文档中使用ElementType来声明XML文件中会出现的元素,ElementType的语法表达如下:
<ElementType name="元素名" content="{ empty | textOnly | eltOnly | mixed }" dt:type="元素类型" order="{ one | seq | many }" model="{ open | closed }" > |
在ElementType的几个属性中,name的含义不言而喻,是所声明元素的名称,它是不可缺少的。content是ElementType的一个重要属性,它指明ElementType所声明的元素是否为空、是否包含文本、是否包含子元素、还是既包含文本又包含子元素。dt:type指定该元素的数据类型,我们会在后面的小节中详细讨论。order指定该元素的子元素的排列顺序规则。最后,model指定该元素是否可以包含未在本Schema中定义的元素和属性,它主要用于其它Schema的引入,也就是其它“命名空间”的引入。“命名空间”的概念大家可能还比较生疏,这是我们下一节要讲的内容,现在你只要了解,在一个XML文件中能够同时使用几个不同的DTD或Schema定义。下表列出了model可能的取值。
取 值 |
释 意
|
open |
表明该元素可以包含其它未在XML Schema中定义的元素和属性 |
closed |
表明该元素只能包含在本XML Schema中定义过的元素和属性 |
缺省状态下,XML Schema的model取值"open",也就是说,该元素可以包含其它未在XML Schema中定义的元素和属性。但是,这并不意味着任何元素和属性都可在Schema中出现,允许出现的前提是这些"异类"元素和属性必须在单独的XML Schema中加以定义,并且必须在引用的它们的元素中以命名空间形式指定其出处。下面给出一个具体的示例。
<联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> <电话>(010)62345678</电话> <传真 xmlns="fax.xml">(010)62345678</传真> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> <ZIP>100001</ZIP> </地址> </联系人> |
本来fclmlschema.xml中并没有定义"传真"元素,但如果将"联系人"元素的的"model"属性设为"open",就可以在"联系人"中引用它,当然还必须指定"传真"元素所在的Schema文件"fax.xml"。"open"体现了XML Schema的可扩展性,而这是DTD所无法比拟的。
ElementType只是起到声明元素的作用,至于元素的内容究竟是什么,则要靠它的子元素element来说明。element的语法表达如下:
<element type="元素类型" [minOccurs="{ 0 | 1 }"] [maxOccurs="{ 1 | * }"] > |
element实际上是对该Schema中ElementType声明的引用,而具体引用什么元素类型,就要靠type属性指定了。type属性不可缺少,并且为了保证type指定的是已经声明过的元素,要求它的取值必须同某个ElementType中的name属性严格一致。至于其它两个属性倒是可有可无。minOccurs指定该元素在其父元素中出现的最小次数,缺省值为1,表明该元素至少出现一次;也可以取值为0,表明该元素是可选的,可以不出现。maxOccurs则指定了该元素出现的最大次数,缺省值同样为1,表明该元素至多出现一次;也可取值为“*”,表明该元素在XML实例文档中出现次数不受限制。
DTD中有成组的概念,相应的,Schema中也有“group”元素。它的语法表达类似element元素:
<group order="{one | seq | many}" [minOccurs="{ 0 | 1 }"] [maxOccurs="{ 1 | * }"] > |
和DTD的规定相同,组里的内容可以是元素,也可以是另一个子组。属性order指定该组中的元素或子组的顺序,minOccurs和maxOccurs分别指定了该组在其父元素中出现的最小次数和最大次数。
下面,我们就开始对DTD和Schema对相同内容的不同定义方式进行一次大比较!
表现内容
DTD
Schema
合法实例
空元素 |
<!ELEMENT a EMPTY> |
<ElementType name="a" content="empty"/> |
<a/> |
<a></a> |
字符串 |
<!ELEMENT a (#PCDATA)> |
<ElementType name="a" content="textOnly"/> |
<a> abcdefg </a> |
父
元
素
|
一个子元素 |
<!ELEMENT a (b)> |
<ElementType name="a" content="eltOnly"> <element type="b"/></ElementType> |
<a> <b/> </a> |
有顺序的 子元素 |
<!ELEMENT a (b, c)> |
<ElementType name="a" order="seq"> <element type="b"/> <element type="c"/></ElementType> |
<a> <b/> <c/> </a> |
OR或 |
<!ELEMENT a (b | c)> |
<ElementType name="a" order="one"> <element type="b"/> <element type="c"/></ElementType> |
<a> <b/> </a> |
<a> <c/> </a> |
任意顺序(或不出现)的子元素 |
<!ELEMENT a (b | c)*> |
<ElementType name="a" order="many"> <element type="b"/> <element type="c"/></ElementType> |
<a/> |
<a> <b/> </a> |
<a> <c/> </a> |
<a> <b/> <c/> </a> |
<a> <c/> <b/> </a> |
可选子元素 |
<!ELEMENT a (b?)> |
<ElementType name="a" content="eltOnly"> <element type="b" minOccurs="0" maxOccurs="1"/></ElementType> |
<a/> |
<a> <b/> </a> |
"+"型重复元素 |
<!ELEMENT a (b+)> |
<ElementType name="a" content="eltOnly"> <element type="b" minOccurs="1" maxOccurs="*"/></ElementType> |
<a> <b/> </a> |
<a> <b/> <b/> </a> |
"*"型重复元素 |
<!ELEMENT a (b*)> |
<ElementType name="a" content="eltOnly"> <element type="b" minOccurs="0" maxOccurs="*"/></ElementType> |
<a/> |
<a> <b/> </a> |
<a> <b/> <b/> </a> |
成组元素 |
<!ELEMENT a (b,c)+> |
<ElementType name="a" content="eltOnly"> <group order="seq" minOccurs="1" maxOccurs="*"/> <element type="b"/> <element type="c"/> </group> </ElementType> |
<a> <b/> <c/> </a> |
<a> <b/> <c/>
<b/> <c/> </a> |
混合元素 |
<!ELEMENT a (#PCDATA | b | c)*> |
<ElementType name="a" content="mixed"/> <element type="b"/> <element type="c"/></ElementType> |
<a> abcdefg </a> |
<a> abcdefg <b/> </a> |
<a> <b/> abcdefg <c/> </a> |
<a> abcd <c/> efg </a> |
用Schema定义元素属性
Schema中用来定义属性的元素有两个,AttributeType元素是声明属性的,attribute元素则是说明一个元素中究竟包含那些属性。
AttributeType元素也是Schema中的重要元素之一,用于定义该Schema文档中出现的属性类型。AttributeType的语法表达如下:
<AttributeType name="属性名" dt:type="属性类型" dt:values="枚举值列表" default="缺省值" required="{yes | no}" > |
下面我们来一个一个看看对于这些属性的规定:
-
name
name不言而喻,自然是所声明的属性类型的名称。注意,该属性是必须的。
-
dt:type
dt:type指定所声明属性的数据类型,它除了支持DTD中包含的全部十大数据类型外,还支持一些扩展属性,在下一小节会详细讲述。Schema中的十个基本属性与DTD中属性的对应关系请见下表:
Schema中基本类型
DTD中数据类型
string |
#PCDATA |
enumeration |
ENUMERATED |
id |
ID |
idref |
IDREF |
idrefs |
IDREFS |
nmtoken |
NMTOKEN |
nmtokens |
NMTOKENS |
entity |
ENTITY |
entities |
EMTITIES |
notation |
NOTATION |
注意,当dt:type取值为"enumeration"时,后面的dt:value必须列出所有可能的取值。
-
dt:value
dt:value只有当dt:type取值"enumeration"时才有效,此时,dt:value需列出所有可能的取值。
-
default
default指定该属性类型的缺省取值。default取值必须是有效的,例如,当dt:type取值"enumeration"时,default的取值必须来自dt:value所列出的值。
-
required
required指定该属性对于引用它的元素是否是必须的。取值yes表明是必须的,取值no则表明并非必须。
我想大家一定还记得前面讲DTD时曾根据关于属性缺省值的规定将属性分为四类,在Schema中,是通过default属性和required属性来作这些规定的。看了下面这个列表就一目了然了。
属性类型
DTD定义方法
Schema定义方法
合法实例
必须赋值的属性 |
<!ATTLIST 天气 状况 (晴 | 阴 | 雨 | 雪) #REQUIRED> |
<AttributeType name="状况" dt:type="enumeration" dt:value="晴 阴 雨 雪" required="yes" /> |
<天气 状况="晴"/> |
属性值可有可无的属性 |
<!ATTLIST 天气 状况 (晴 | 阴 | 雨 | 雪) #IMPLIED> |
<AttributeType name="状况" dt:type="enumeration" dt:value="晴 阴 雨 雪" required="no" /> |
<天气 状况="晴"/> |
<天气/> |
定义缺省值的属性 |
<!ATTLIST 天气 状况 (晴 | 阴 | 雨 | 雪) "晴"> |
<AttributeType name="状况" dt:type="enumeration" dt:value="晴 阴 雨 雪" default="晴" required="yes" /> |
<天气 状况="阴"/> |
<天气/> |
固定取值的属性 |
<!ATTLIST 天气 状况 (晴 | 阴 | 雨 | 雪) #FIXED> |
<AttributeType name="状况" dt:type="enumeration" dt:value="晴 阴 雨 雪" default="晴" required="no" /> |
<天气/> |
AttributeType和attribute的关系与ElementType和element的关系相同,AttributeType只是起到声明属性的作用,而真正指明一个元素具有哪些属性还需依靠attribute元素。attribute的语法表达如下:
<attribute type="attribute-type" default="default-value" [required="{yes | no}"] > |
因为attribute实际上是对该Schema中AttributeType声明的引用,而具体引用什么属性类型,关键就要靠type属性了。type唯一指定了要引用的属性类型,因此其取值必须同某个AttributeType元素中name属性的取值严格一致。其它两个属性与AttributeType中相应属性的含义相同,default指定该属性类型的缺省取值,required指定该属性对于引用它的元素是否是必须的。如果和同一个属性相对应的AttributeType和attribute中都对default和required给出了定义,则在attribute中的取值具有更高的优先级。
最后,我们给出关于上面“天气”元素及其属性的一个完整的Schema定义:
<AttributeType name="状况" dt:type="enumeration" dt:value="晴 阴 雨 雪" required="yes" />
<ElementType name="天气" content="empty"> <attribute type="状况"/> </ElementType>
|
Schema的特色——扩展数据类型
Schema中共有23种扩展数据类型,包括bin.base64、bin.hex、boolean、char、date、dateTime、dateTime.tz、fixed.14.4、float、int、number、time、time.tz、i1、i2、i4、r4、r8、ui1、ui2、ui4、uri、uuid,已经可以覆盖相当广泛的应用。限于篇幅,这里只列表介绍几种最常用的类型。
类 型
解 释
举 例
boolean |
布尔型:0 或 1, 其中0代表false,1代表true |
0,1 |
char |
单字符 |
“a”、“b” |
time |
时间类型,符合 ISO 8601格式, 无日期和时区部分。 |
08:16:18 |
date |
日期类型,符合ISO 8601格式且无时间部分. |
2000-06-01 |
dateTime |
日期类型,符合ISO 8601格式,带可选时间部分但无时区部分,秒可精确到纳秒级。 |
2000-06-01T20:08:18 |
fixed.14.4 |
数值类型,同“number”类似,但精度上小数点前不超过14位,小数点后不超过4位 |
14.1234 |
float |
实数类型,位数不受限制,可以包含符号位和小数位以及指数。取值范围从 1.7976931348623157E+308 至 2.2250738585072014E-308 |
.314159265358979E+1 |
int |
数值类型, 可以包含符号位,但不含小数位和指数位 |
1, -10, 2566 |
number |
数值类型,位数不限,可以包含符号位和小数位以及指数。取值范围从 1.7976931348623157E+308 至 2.2250738585072014E-308 |
12, 3.1415, -1.24E-10 |
uri |
统一资源标识(URI)类型。 |
http://www.ics. uci.edu /pub/ietf/uri/ |
元素和属性的数据类型可以使用元素datatype来定义,这个元素是Schema中一个重要元素,也是Schema的一大特色。datatype的语法表达如下:
<datatype dt:type="datatype"> |
除此以外,还有另一种更直接的方法,是在元素ElementType和AttributeType之中利用dt:type属性。下面分别给出具体的示例:
datatype
dt:type
ElementType |
<ElementType name="a"> <datatype dt:type=" float"> </ElementType> |
<ElementType name="a" dt:type="float"/> |
AttributeType |
<AttributeType name ="b"/> <datatype dt:type="float"/></AttributeType> <ElementType name="a"> <attribute type="b"/> </ElementType> |
<AttributeType name="b" dt:type="float"/> <ElementType name="a"> <attribute type="b"/> </ElementType> |
好了,现在我们结束这些枯燥的语法论述,来看个实际的例子:
<AttributeType name="更新时间"> <datatype dt:type="dateTime"/> </AttributeType>
<ElementType name="description"/> <ElementType name="品牌" dt:type="string"/> <ElementType name="价格" dt:type="int"/> <ElementType name="是否全内置" dt:type="boolean"/> <ElementType name="库存数量" dt:type="number"/>
<ElementType name="笔记本电脑" content="eltOnly"> <attribute type="更新时间" /> <element type="品牌" /> <element type="价格" /> <element type="是否全内置" /> <element type="库存数量" /> </ElementType>
|
上面给出的是一个关于笔记本电脑的Schema定义,在这里,我们为笔记本电脑定义了一个属性--资料更新时间,数据类型定为dateTime;笔记本电脑涉及的元素有:品牌,因为它实际上是一个名称,所以定为string类型;价格,因为考虑到经销商不会小气到连几毛钱都不放过,所以数据类型定为int型;是否全内置,不言而喻自然是铁板钉钉的布尔型了;库存数量,因为考虑到经销上可能会大量囤积以谋取高利,故而选取范围较大的number类型。下面我们再给出一个XML示例文档,以便大家对数据类型有一个更加直观的认识。
<笔记本电脑 更新时间="2000-06-10T14:00:00"> <品牌>ACER 518TE</品牌> <价格>22800</价格> <是否全内置>1</是否全内置> <库存数量>258000</库存数量> </笔记本电脑> |
可是,假设我们偏偏遇上了一个爱专牛角尖且极为小气的电脑经销商,他擅自将上面的实例文档加以改动挂在自己门口,于是就有下面的文档:
<笔记本电脑 更新时间="2000-06-10T14:00:00"> <品牌>ACER 518TE</品牌> <价格>22800.21</价格> <是否全内置>1</是否全内置> <库存数量>258000</库存数量> </笔记本电脑> |
就在他自鸣得意于自己的精明时,我们的语法分析器却报警了:“价格”取值与定义不符!当然了,明明是int类型,又岂能再加上一个小数点?除非我们将上面的Schema中的“价格”定义作下列修改:
<ElementType name="价格" dt:type="fixed.14.4"/> |
---------------------- android培训、java培训、期待与您交流!----------------------
分享到:
相关推荐
GraphQL是由Facebook发明和开发的一种新的API标准。它是一种开源的服务器端技术,现在由世界各地的公司和个人组成的大型社区维护。它也是一个执行引擎,作为数据查询语言,用于获取声明性数据。...
8. **错误处理和调试**:在遇到schema校验失败时,学习如何解读错误信息,定位问题所在,以及调试和修复是十分重要的技能。 9. **最佳实践**:在设计schema时,应遵循简洁、可扩展和易于理解的原则,同时考虑未来...
#### Schema Repository对象解读 Schema Repository对象是处理Rational ClearQuest数据模型的关键。本书提供了详细的指南,帮助开发者理解和操作这些对象,以实现数据的高效管理和应用。 #### 总结 《Rational ...
- **2.4.1 schema.xml**:详细解读schema.xml文件的结构和作用,以及如何定义字段和字段类型。 - **2.4.2 solrconfig.xml**:深入讲解solrconfig.xml文件的配置选项,包括查询处理器链、缓存策略等。 #### 三、Solr...
为了充分利用`performance_schema`,你需要了解如何解析和解读其中的数据。MySQL提供了一些内置的视图,如`events_statements_summary_by_digest`用于查看SQL语句的执行统计,`threads`用于查看当前活动的线程信息,...
此外,错误处理也是一个关键问题,因为XML Schema验证失败可能会导致复杂的错误信息,需要有经验的开发者进行解读。 总结来说,xmlschema-0.9.17是Python开发者处理XML数据和验证XML文档的强大工具。它通过提供直观...
4. **安全性增强**: 采用加密技术保护敏感数据,确保即使数据被非法访问也无法解读其具体内容。 #### 六、总结 通过对《Schema_Reference_Guide_SEP12.1》文档的学习,我们不仅了解了Symantec Endpoint Protection...
在描述中提到的“sh si oe ix hr”可能是对样本模式中不同部分或者对象的简写,具体对应关系可能需要通过文档来详细解读。 在Oracle数据库中,一个schema是一个命名的逻辑存储单元,它由一个特定用户拥有,并包含该...
WSDL文件的解读有助于理解Web服务的协议,特别是它与SOAP(简单对象访问协议)的关系。 为什么需要WSDL?WSDL的出现是为了克服互联网上不同系统间通信的障碍。尽管Internet协议已经存在,但为了确保服务之间的互...
**标签解读** 1. **visualization**:这是关于数据或信息的可视化,这里的含义是将Schema结构转化为图形界面展示。 2. **clojure**:Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机上,用于构建可扩展和...
JSON Editor解读 JSON Editor 是一个功能强大的 JSON 编辑器,支持多种格式和编辑器,能够满足不同的需求和应用场景。下面将详细解释 JSON Editor 的各种特性和使用方法。 schema 支持多种 format 取值 JSON ...
#### 三、解读`INFORMATION_SCHEMA.STATISTICS`表 `INFORMATION_SCHEMA.STATISTICS`表包含了多个字段,这些字段提供了有关索引的各种详细信息。主要字段及其含义如下: - `table_schema`: 表所在的数据库名。 - `...
本文将详细讲解如何统计MySQL数据库的数据量大小,并涉及CONCAT函数的解读,以及对information_schema和performance_schema库的查询方法。 首先,我们需要理解数据量统计的基本概念。数据量通常指的是数据库中所有...
JSON Editor解读 JSON Editor是一种功能强大且灵活的JSON编辑器,支持多种格式的string类型,包括HTML5 input类型和第三方专门的编辑器。下面是JSON Editor的详细知识点: 一、JSON Editorformat JSON Editor支持...
6. **DTD(Document Type Definition)与XSD(XML Schema Definition)**:这两种是XML文档的验证工具,用于定义元素和属性的结构和规则,确保XML文档的正确性。 7. **XML解析**:解析XML文档可以使用DOM(Document...
- **新特性介绍**:如增加支持Schema Registry等。 - **API变更**:旧API的弃用及新API的引入。 - **性能改进**:包括性能瓶颈的解决方法和最佳实践。 #### 十二、Kafka框架设计 - **设计原则**:可伸缩性、容错性...
- **Kafka增强**:提供Kafka的监控和预警功能,支持Schema Registry和Kafka Connect,简化数据Rebalance操作,使Kafka更易于使用。 - **Druid**:引入高性能的实时查询系统Druid,适用于广告平台数据分析、实时...
由于我们无法直接查看压缩文件的内容,以上的解读是基于标题和描述的合理推测。实际文件可能包含更具体的信息,如详细的XML Schema定义、最佳实践、常见问题解答或案例研究。对于AUTOSAR开发者和汽车行业内的软件...
EDM 是一个包含 CSDL(Conceptual Schema Definition Language)、SSDL(Storage Schema Definition Language)和 MSL(Mapping Specification Language)三部分的XML 文件。CSDL 描述了应用程序中的实体模型结构,...
Weaviate是一款先进的矢量数据库,专为处理和检索基于矢量的数据而设计。它将传统的结构化数据处理与现代的非结构化数据处理相结合,特别是在处理机器学习模型产生的高维向量数据时表现优秀。这个数据库系统的核心...