一、XML;
概念:可扩展的标记语言(Extensible Markup Language,XML)。
用于标记电子文件使其具有结构性的标记的源语言,可以用来标记数据,定义数据类
型,是一种允许用户对自己的标记语言进行定义的源语言。
XML 是标标准通用标记语言(SGML)的子集,非常适合Web 传输。
XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
注意:XML必须要有跟标签,并且有且只有一个跟标签
<! xml version=”1.0” encoding=”UTF-8”?>
<root></root>
XML 标签的开始标签要成对出现,并且要有严格的对应关系,对大小写十分敏感。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<sub>
</sub>
</child>
<child>
<sub>
</sub>
</child>
</root>
(一) DTD;
概念:DTD(文本类型定义)可以定义合法的XML 文档结构,他使用一系列的合法元素来
定义文档的结构。
分类:DTD 分为内部DTD 和外部DTD。
所谓的内部DTD 是指该DTD 在某个文档的内部,只被该文档调用。
所谓的外部DTD 是指该DTD 不在文档内部,可以被其他所有的文档来共享的。
DTD 文档与xml 文档实例的关系可以看成是类和对象的关系,当然对于xml 文档而言,
DTD 不是必须的,但是DTD 为xml 文档的编写带来了方便,加强了文档标记内参数的一致
性。
1.DTD元素的定义;
1) 根元素的声明;
每个xml 文档度只有一个根元素,其他的子元素都包含在该根元素中,因此在DTD 中
对根元素的声明是并不可少的。
<!DOCTYPE root [
]>
注意:
DOCTYPE 是“document type”(文档类型)的缩写,DOCTYPE 声明必须放在文档的最前
面,在所有的代码和标识之上,DOCTYPE 声明是必须不可少的关键组成部分的
DTD 语法要求DOCTYPE 必须要大写,而且DOCTYPE 和元素之间必须要有空格隔开的,
如在以上代码中DCOTYPE 和根元素(root)之间也要有空格隔开的。
2) 元素声明;
语法:
<!ELEMENT 元素名元素类型>
类型分为:
1、EMPTY
2、(#PCDATA)
3、ANY
4、其他非关键字类型
(,……..)只包含子元素,没有字符串数据
使用符号
关键字和符号的综合
01. EMPTY & #PCDATA;
<!-- 不能有字符数据& 可以包含字符数据-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root (child1, child2)>
<!ELEMENT child1 EMPTY>
<!-- 不能有字符数据-->
<!ELEMENT child2 (#PCDATA)>
<!-- 可以包含字符数据-->
]>
<root>
<child1/>
<child2>AA</child2>
</root>
02. ANY;
<!-- ANY类型表示可以包含多个子元素且不受限制,也可包含字符串数据. 一般用在
对根元素的声明中-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root ANY>
<!-- ANY类型表示可以包含多个子元素且不受限制,也可包含字符串
数据. 一般用在对根元素的声明中-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT email (#PCDATA)>
]>
<root>
<name>JAMES</name>
<email>A@B.C</email>
<email>a@b.c</email>
<!-- 个数不受限制-->
;;;
</root>
03. 其他非关键字类型;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ELEMENT name (firstname, middename, lastname)>
<!ELEMENT firstname EMPTY>
<!ELEMENT middename EMPTY>
<!ELEMENT lastname EMPTY>
]>
<name>
<!--HELLO-->
<firstname/>
<middename/>
<lastname/>
</name>
注意:<!ELEMENT name (firstname,middename,lastname)> 表示定义name 元素只包
含括号内声明子元素,并且name 元素中不能含有字符串数据.括号内的逗号,决定了子
元素出现的顺序
04. 子元素和符号;
+:元素至少出现一次;
*:元素出现0 到多次;
?:元素出现0 或一次;
|:两个元素只出现一个
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (from?, to+, heading, (body | message))>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT message (#PCDATA)>
]>
<note>
<from>John</from>
<!-- 可以出现0或1次-->
<to>George</to>
<!-- 可以出现1到多次-->
<to>George</to>
<heading>Reminder</heading>
<!-- 必须出现且1次-->
<body>Don't forget the meeting!</body>
<!-- body 和message 只能出现一种. -->
<message>s</message>
</note>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (from, to, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<from>John</from>
<to>George</to>
<to>George</to>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(二) DTD详解;
2.DTD 简介;
文档类型定义(DTD)可定义合法的XML 文档构建模块。它使用一系列合法的元素来定
义文档的结构。
DTD 可被成行地声明于XML 文档中,也可作为一个外部引用。
3) 内部的DOCTYPE 声明;
假如DTD 被包含在您的XML 源文件中,它应当通过下面的语法包装在一个DOCTYPE
声明中:
<!DOCTYPE 根元素[元素声明]>带有DTD 的XML 文档实例(请在IE5 以及更高的版
本打开,并选择查看源代码):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
在您的浏览器中打开此XML 文件,并选择“查看源代码”命令。
以上DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是note 类型的文档。
!ELEMENT note (第三行)定义note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义to 元素为"#PCDATA" 类型
!ELEMENT from (第五行)定义frome 元素为"#PCDATA" 类型
!ELEMENT heading (第六行)定义heading 元素为"#PCDATA" 类型
!ELEMENT body (第七行)定义body 元素为"#PCDATA" 类型
4) 外部文档声明;
假如DTD 位于XML 源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE
定义中:
<!DOCTYPE 根元素SYSTEM "文件名">这个XML 文档和上面的XML 文档相同,但是拥
有一个外部的DTD: (在IE5 中打开,并选择“查看源代码”命令。)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<!--这是包含DTD 的"note.dtd" 文件:-->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
5) 为什么使用DTD?
通过DTD,您的每一个XML 文件均可携带一个有关其自身格式的描述。
通过DTD,独立的团体可一致地使用某个标准的DTD 来交换数据。
而您的应用程序也可使用某个标准的DTD 来验证从外部接收到的数据。
您还可以使用DTD 来验证您自身的数据。
3.DTD - XML 构建模块;
XML 以及HTML 文档的主要构建模块是类似<body>....</body> 这样的标签。
6) XML 文档构建模块;
所有的XML 文档(以及HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
7) 下面是每个构建模块的简要描述;
05. 元素;
元素是XML 以及HTML 文档的主要构建模块。
HTML 元素的例子是"body" 和"table"。XML 元素的例子是"note" 和"message" 。元素
可包含文本、其他元素或者是空的。空的HTML 元素的例子是"hr"、"br" 以及"img"。
实例:
<body>body text in between</body>
<message>somemessage in between</message>
06. 属性;
属性可提供有关元素的额外信息。
属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。下面的"img"
元素拥有关于源文件的额外信息:
[img]computer.gif[/img] 元素的名称是"img" 。属性的名称是"src" 。属性的值是
"computer.gif"。由于元素本身为空,它被一个" /" 关闭。
07. 实体;
实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个HTML 实体引用:" "。这个“无折行空格”实体在HTML 中
被用于在某个文档中插入一个额外的空格。
当文档被XML 解析器解析时,实体就会被展开。
下面的实体在XML 中被预定义:
实体引用字符;
< <
> >
& &
" "
' '
08. PCDATA;
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&、< 或者> 字符;需要使用&、< 以
及> 实体来分别替换它们。
09. CDATA;
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的
实体也不会被展开。
4.DTD 元素;
在一个DTD 中,元素通过元素声明来进行声明。
8) 声明一个元素;
在DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称类别>或者
<!ELEMENT 元素名称(元素内容)>
9) 空元素;
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称EMPTY>
例子:
<!ELEMENT br EMPTY>XML
例子:
10) 只有PCDATA 的元素;
只有PCDATA 的元素通过圆括号中的#PCDATA 进行声明:
<!ELEMENT 元素名称(#PCDATA)>
例子:
<!ELEMENT from(#PCDATA)>
11) 带有任何内容的元素;
通过类别关键词ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT 元素名称ANY>
例子:
<!ELEMENT note ANY>
12) 带有子元素(序列)的元素;
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称(子元素名称1)>或者
<!ELEMENT 元素名称(子元素名称1,子元素名称2,.....)>
例子:
<!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档
中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元
素的完整声明是:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>声明只出现一次的元素
例子:
<!ELEMENT 元素名称(子元素名称)>
<!ELEMENT note (message)>
上面的例子声明了:message 子元素必须出现一次,并且必须只在"note" 元素中出现一次。
13) 声明最少出现一次的元素;
<!ELEMENT 元素名称(子元素名称+)>
例E.._uc2子:Ó
<!ELEMENT note (message+)>
上面的例子中的加号声明了:message 子元素必须在"note" 元素内出现至少一次。
14) 声明出现零次或多次的元素;
<!ELEMENT 元素名称(子元素名称*)>
例子:
<!ELEMENT note (message*)>
上面的例子中的星号声明了:子元素message 可在"note" 元素内出现零次或多次。
15) 声明出现零次或一次的元素;
<!ELEMENT 元素名称(子元素名称?)>
例子:
<!ELEMENT note (message?)>上面的例子中的问号声明了:子元素message 可在"note" 元
素内出现零次或一次
16) 声明“非.../既...”类型的内容;
例子:
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含"to" 元素、"from" 元素、"header" 元素,以及
非"message" 元素既"body" 元素。
17) 声明混合型的内容;
例子:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的PCDATA、"to"、"from"、"header"
或者"message"。
5.DTD 属性;
在DTD 中,属性通过ATTLIST 声明来进行声明。
18) 声明属性;
属性声明拥使用下列语法:
<!ATTLIST 元素名称属性名称属性类型默认值>
DTD 实例:
<!ATTLIST payment type CDATA "check">
XML 实例:
<payment type="check" />
以下是属性类型的选项:
默认值参数可使用下列值:
19) 规定一个默认的属性值;
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的XML:
<square width="100" />
在上面的例子中,"square" 被定义为带有CDATA 类型的"width" 属性的空元素。如果宽度
没有被设定,其默认值为0 。
20) #IMPLIED
语法
<!ATTLIST 元素名称属性名称属性类型#IMPLIED>
例子
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的XML:
<contact fax="555-667788" />合法的XML:
<contact />假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词
#IMPLIED。
21) #REQUIRED;
语法
<!ATTLIST 元素名称属性名称属性类型#REQUIRED>例子
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的XML:
<person number="5677" />
非法的XML:
<person />假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词
#REQUIRED。
#FIXED
语法
<!ATTLIST 元素名称属性名称属性类型#FIXED "value">
例子
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的XML:
<sender company="Microsoft" />
非法的XML:
<sender company="W3School" />
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用#FIXED 关键词。如果作
者使用了不同的值,XML 解析器会返回错误。
列举属性值
语法:
<!ATTLIST 元素名称属性名称(en1|en2|..) 默认值>
DTD 例子:
<!ATTLIST payment type (check|cash) "cash">XML 例子:
<payment type="check" />或者
<payment type="cash" />
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。
6.DTD 实体;
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
22) 一个内部实体声明;
语法:
<!ENTITY 实体名称"实体的值">
例子:
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
注释: 一个实体由三部分构成: 一个和号(&), 一个实体名称, 以及一个分号(;)。
23) 一个外部实体声明;
语法:
<!ENTITY 实体名称SYSTEM "URI/URL">
例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
7.DTD 验证;
Internet Explorer 5.0 可根据某个DTD 来验证您的XML。
24) 通过XML 解析器进行验证;
当您试图打开某个XML 文档时,XML 解析器有可能会产生错误。通过访问parseError
对象,就可以取回引起错误的确切代码、文本甚至所在的行。
注释:load( ) 方法用于文件,而loadXML( ) 方法用于字符串。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)Try it Yourself
或者仅仅看一下这个XML 文件。
25) 关闭验证;
通过把XML 解析器的validateOnParse 设置为"false",就可以关闭验证。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)Try it Yourself
26) 通用的XML 验证器;
为了帮助您验证XML 文件,我们创建了此链接,这样你就可以验证任何XML 文件了。
parseError 对象
8.DTD 实例;
27) 电视节目表DTD;
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER, DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE, (HOLIDAY | PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME, TITLE, DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE
CDATA #REQUIRED
>
<!ATTLIST CHANNEL
CDATA #REQUIRED
>
<!ATTLIST PROGRAMSLOT
CDATA #IMPLIED
>
<!ATTLIST TITLE
CDATA #IMPLIED
CDATA #IMPLIED
>]
>
28) 报纸文章DTD;
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE, BYLINE, LEAD, BODY, NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE
CDATA #REQUIRED
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>
29) 产品目录DTD;
<!DOCTYPE CATALOG [
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT (SPECIFICATIONS+, OPTIONS?, PRICE+,
NOTES?)>
<!ATTLIST PRODUCT
CDATA #IMPLIED
(HandTool | Table | Shop-Professional) "HandTool"
CDATA #IMPLIED
(Pittsburgh | Milwaukee | Chicago) "Chicago"
(InStock | Backordered | Discontinued) "InStock"
>
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
(Metal | Polished | Matte) "Matte"
(Included | Optional | NotApplicable) "Included"
(HardShell | Soft | NotApplicable) "HardShell"
>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ELEMENT NOTES (#PCDATA)>
]>
9.DTD 总结;
(三) Schema;
XML Schema 是基于XML 的DTD 替代者。
XML Schema 描述XML 文档的结构。
XML Schema 语言也称作XML Schema 定义(XML Schema Definition,XSD)。
10. 概念:
XML Schema 的作用是定义XML 文档的合法构建模块,类似DTD。
XML Schema:
定义可出现在文档中的元素
定义可出现在文档中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
11. DTD可能被Schema取代的理由:
• XML Schema 可针对未来的需求进行扩展
• XML Schema 更完善,功能更强大
• XML Schema 基于XML 编写
• XML Schema 支持数据类型
• XML Schema 支持命名空间
12. 为什么要使用XML Schema;
XML Schema 比DTD 更强大;
30) XML Schema 支持数据类型;
XML Schema 最重要的能力之一就是对数据类型的支持。
通过对数据类型的支持:
10. 可更容易地描述允许的文档内容
11. 可更容易地验证数据的正确性
12. 可更容易地与来自数据库的数据一并工作
13. 可更容易地定义数据约束(data facets)
14. 可更容易地定义数据模型(或称数据格式)
15. 可更容易地在不同的数据类型间转换数据
31) XML Schema 使用XML 语法;
另一个关于XML Schema 的重要特性是,它们由XML 编写。
由XML 编写XML Schema 有很多好处:
16. 不必学习新的语言
17. 可使用XML 编辑器来编辑Schema 文件
18. 可使用XML 解析器来解析Schema 文件
19. 可通过XML DOM 来处理Schema
20. 可通过XSLT 来转换Schema
32) XML Schema 可保护数据通信;
当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。
通过XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。
一种数据,比如"03-11-2004",在某些国家被解释为11 月3 日,而在另一些国家为当
作3 月11 日。
但是一个带有数据类型的XML 元素,比如:<date type="date">2004-03-11</date>,可确保
对内容一致的理解,这是因为XML 的数据类型"date" 要求的格式是"YYYY-MM-DD"。
33) XML Schema 可扩展;
21. XML Schema 是可扩展的,因为它们由XML 编写。
22. 通过可扩展的Schema 定义,您可以:
23. 在其他Schema 中重复使用您的Schema
24. 创建由标准类型衍生而来的您自己的数据类型
25. 在相同的文档中引用多重的Schema
34) 形式良好是不够的;
我们把符合XML 语法的文档称为形式良好的XML 文档,比如:
26. 它必须以XML 声明开头
27. 它必须拥有唯一的根元素
28. 开始标签必须与结束标签相匹配
29. 元素对大小写敏感
30. 所有的元素都必须关闭
31. 所有的元素都必须正确地嵌套
32. 必须对特殊字符使用实体
即使文档的形式良好,仍然不能保证它们不会包含错误,并且这些错误可能会产生严重的后
果。
13. XSD 为何使用;
XML 文档可对DTD 或XML Schema 进行引用。
一个简单的XML 文档:
请看这个名为"note.xml" 的XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
DTD 文件:
下面这个例子是名为"note.dtd" 的DTD 文件,它对上面那个XML 文档的元素进行了定
义:
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
第1 行定义note 元素有四个子元素:"to, from, heading, body"。
第2-5 行定义了to, from, heading, body 元素的类型是"#PCDATA"。
35) XML Schema;
下面这个例子是一个名为"note.xsd" 的XML Schema 文件,它定义了上面那个XML 文档
的元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
note 元素是一个复合类型,因为它包含其他的子元素。其他元素(to, from, heading, body) 是
简易类型,因为它们没有包含其他元素。您将在下面的章节学习更多有关复合类型和简易类
型的知识。
36) 对DTD 的引用;
此文件包含对DTD 的引用:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
37) 对XML Schema 的引用;
此文件包含对XML Schema 的引用:
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
38) XSD <schema> ;
<schema> 元素是每一个XML Schema 的根元素。
39) <schema> 元素;
<schema> 元素是每一个XML Schema 的根元素:
<?xml version="1.0"?>
<xs:schema>
…… </xs:schema>
<schema> 元素可包含属性。一个schema 声明往往看上去类似这样:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn" elementFormDefault="qualified">
...
...
</xs:schema>
代码解释:
下面的片断:
xmlns:xs="http://www.w3.org/2001/XMLSchema"显示schema 中用到的元素和数据类型来自
命名空间"http://www.w3.org/2001/XMLSchema" 。同时它还规定了来自命名空间
"http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀xs:
这个片断:
targetNamespace="http://www.w3school.com.cn" 显示被此schema 定义的元素(note, to,
from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。
这个片断:
xmlns="http://www.w3school.com.cn" 指出默认的命名空间是
"http://www.w3school.com.cn"。
这个片断:
elementFormDefault="qualified" 指出任何XML 实例文档所使用的且在此schema 中声明
过的元素必须被命名空间限定。
40) 在XML 文档中引用Schema;
此XML 文档含有对XML Schema 的引用:
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
代码解释:
下面的片断:
xmlns="http://www.w3school.com.cn" 规定了默认命名空间的声明。此声明会告知schema
验证器,在此XML 文档中使用的所有元素都被声明于"http://www.w3school.com.cn" 这个
命名空间。
一旦您拥有了可用的XML Schema 实例命名空间:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 您就可以使用schemaLocation 属
性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的
XML schema 的位置:
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
41) 简单的类型;
XML Schema 可定义XML 文件的元素。
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。
14. 什么是简易元素?
简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。
不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是XML Schema
定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定
制类型。
您也可向数据类型添加限定(即facets),以此来限制它的内容,或者您可以要求数据
匹配某种特定的模式。
42) 定义简易元素;
定义简易元素的语法:
<xs:element name="xxx" type="yyy"/>此处xxx 指元素的名称,yyy 指元素的数据类型。XML
Schema 拥有很多内建的数据类型。
最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
例子:
这是一些XML 元素:
<?xml version="1.0" encoding="UTF-8"?>
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn><!--这是相应的简易元素定义:-->
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
43) 简易元素的默认值和固定值;
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"red":
<xs:element name="color" type="xs:string" default="red"/>固定值同样会自动分配给元素,并
且您无法规定另外一个值。
在下面的例子中,固定值是"red":
<xs:element name="color" type="xs:string" fixed="red"/>
15. XSD 属性;
所有的属性均作为简易类型来声明。
44) 什么是属性?
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本
身总是作为简易类型被声明的。
45) 如何声明属性?
定义属性的语法是:
<xs:attribute name="xxx" type="yyy"/>在此处,xxx 指属性名称,yyy 则规定属性的数据类型。
XML Schema 拥有很多内建的数据类型。
33. 最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
实例
这是带有属性的XML 元素:
<lastname lang="EN">Smith</lastname>这是对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>
46) 属性的默认值和固定值;
属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"EN":
<xs:attribute name="lang" type="xs:string" default="EN"/>固定值同样会自动分配给元素,并且
您无法规定另外的值。
在下面的例子中,固定值是"EN":
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
47) 可选的和必需的属性;
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用"use" 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
48) 对内容的限定;
当XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如XML 元素的类型是"xs:date",而其包含的内容是类似"Hello World" 的字符串,元素
将不会(通过)验证。
通过XML schema,您也可向您的XML 元素及属性添加自己的限定。这些限定被称为facet
16. XSD 限定;
限定(restriction)用于为XML 元素或者属性定义可接受的值。对XML 元素的限定被
称为facet。
49) 对值的限定;
下面的例子定义了带有一个限定且名为"age" 的元素。age 的值不能低于0 或者高于
120:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
50) 对一组值的限定;
如需把XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration
constraint)。
下面的例子定义了带有一个限定的名为"car" 的元素。可接受的值只有:Audi, Golf, BMW:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
上面的例子也可以被写为:
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</element>
注释:在这种情况下,类型"carType" 可被其他元素使用,因为它不是"car" 元素的组成部
分。
51) 对一系列值的限定;
如需把XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束
(pattern constraint)。
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值只有小写字母a - z 其
中的一个:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"initials" 的元素。可接受的值是大写字母A - Z 其
中的三个:
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子也定义了带有一个限定的名为"initials" 的元素。可接受的值是大写或小写字母
a - z 其中的三个:
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"choice 的元素。可接受的值是字母x, y 或z 中的
一个:
<xs:element name="choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"prodid" 的元素。可接受的值是五个阿拉伯数字的
一个序列,且每个数字的范围是0-9:
<xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
52) 对一系列值的其他限定;
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值是a - z 中零个或多个
字母:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值是一对或多对字母,每
对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,
但是"Stop"、"STOP" 或者"stop" 无法通过验证:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"gender" 的元素。可接受的值是male 或者
female:
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"password" 的元素。可接受的值是由8 个字符组
成的一行字符,这些字符必须是大写或小写字母a - z 亦或数字0 - 9:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
53) 对空白字符的限定;
如需规定对空白字符(whitespace characters)的处理方式,我们需要使用whiteSpace 限定。
下面的例子定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"preserve",这意味着XML 处理器不会移除任何空白字符:
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"replace",这意味着XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"collapse",这意味着XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被
替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
54) 对长度的限定;
如需限制元素中值的长度,我们需要使用length、maxLength 以及minLength 限定。
本例定义了带有一个限定且名为"password" 的元素。其值必须精确到8 个字符:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"password" 的元素。其值最小为5 个字符,最大
为8 个字符:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
55) 数据类型的限定;
56) 复杂的类型;
复合元素包含了其他的元素及/或属性。
57) 什么是复合元素?
复合元素指包含其他元素及/或属性的XML 元素。
34. 有四种类型的复合元素:
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
注释:上述元素均可包含属性!
复合元素的例子
复合元素,"product",是空的:
<product pid="1345"/>
复合元素,"employee",仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
复合元素,"food",仅包含文本:
<food type="dessert">Ice cream</food>
复合元素,"description",包含元素和文本:
<description>happened on <date lang="norwegian">03.03.99</date> ....
</description>
58) 如何定义复合元素?
请看这个复合XML 元素,"employee",仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
59) 在XML Schema 中,我们有两种方式来定义复合元素:
1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
假如您使用上面所描述的方法,那么仅有"employee" 可使用所规定的复合类型。请注意其
子元素,"firstname" 以及"lastname",被包围在指示器<sequence>中。这意味着子元素必
须以它们被声明的次序出现。您会在XSD 指示器这一节学习更多有关指示器的知识。
2. "employee" 元素可以使用type 属性,这个属性的作用是引用要使用的复合类型的名称:
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
17. XSD 仅含元素;
“仅含元素”的复合类型含有一个仅包含其他元素的元素。
60) 复合类型仅包含元素;
XML 元素,"person",仅包含其他的元素:
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</person>您可在schema 中这样定义"person" 元素:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
请留意这个<xs:sequence>。它意味着被定义的元素必须按上面的次序出现在"person" 元
素中。
或者您可以为complexType 元素设定一个名称,并让"person" 元素的type 属性来引用此
名称(如使用此方法,若干元素均可引用相同的复合类型):
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
61) XSD 仅含文本;
62) XSD 混合内容
63) XSD 指示器;
64) XSD <any> ;
65) XSD <anyAttribute>
66) XSD 元素替换;
67) XSD 实例;
18. 数据类型;
68) XSD 字符串;
69) XSD 日期;
70) XSD 数值;
71) XSD 杂项;
72) XSD 总结;
概念:可扩展的标记语言(Extensible Markup Language,XML)。
用于标记电子文件使其具有结构性的标记的源语言,可以用来标记数据,定义数据类
型,是一种允许用户对自己的标记语言进行定义的源语言。
XML 是标标准通用标记语言(SGML)的子集,非常适合Web 传输。
XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
注意:XML必须要有跟标签,并且有且只有一个跟标签
<! xml version=”1.0” encoding=”UTF-8”?>
<root></root>
XML 标签的开始标签要成对出现,并且要有严格的对应关系,对大小写十分敏感。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<sub>
</sub>
</child>
<child>
<sub>
</sub>
</child>
</root>
(一) DTD;
概念:DTD(文本类型定义)可以定义合法的XML 文档结构,他使用一系列的合法元素来
定义文档的结构。
分类:DTD 分为内部DTD 和外部DTD。
所谓的内部DTD 是指该DTD 在某个文档的内部,只被该文档调用。
所谓的外部DTD 是指该DTD 不在文档内部,可以被其他所有的文档来共享的。
DTD 文档与xml 文档实例的关系可以看成是类和对象的关系,当然对于xml 文档而言,
DTD 不是必须的,但是DTD 为xml 文档的编写带来了方便,加强了文档标记内参数的一致
性。
1.DTD元素的定义;
1) 根元素的声明;
每个xml 文档度只有一个根元素,其他的子元素都包含在该根元素中,因此在DTD 中
对根元素的声明是并不可少的。
<!DOCTYPE root [
]>
注意:
DOCTYPE 是“document type”(文档类型)的缩写,DOCTYPE 声明必须放在文档的最前
面,在所有的代码和标识之上,DOCTYPE 声明是必须不可少的关键组成部分的
DTD 语法要求DOCTYPE 必须要大写,而且DOCTYPE 和元素之间必须要有空格隔开的,
如在以上代码中DCOTYPE 和根元素(root)之间也要有空格隔开的。
2) 元素声明;
语法:
<!ELEMENT 元素名元素类型>
类型分为:
1、EMPTY
2、(#PCDATA)
3、ANY
4、其他非关键字类型
(,……..)只包含子元素,没有字符串数据
使用符号
关键字和符号的综合
01. EMPTY & #PCDATA;
<!-- 不能有字符数据& 可以包含字符数据-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root (child1, child2)>
<!ELEMENT child1 EMPTY>
<!-- 不能有字符数据-->
<!ELEMENT child2 (#PCDATA)>
<!-- 可以包含字符数据-->
]>
<root>
<child1/>
<child2>AA</child2>
</root>
02. ANY;
<!-- ANY类型表示可以包含多个子元素且不受限制,也可包含字符串数据. 一般用在
对根元素的声明中-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root ANY>
<!-- ANY类型表示可以包含多个子元素且不受限制,也可包含字符串
数据. 一般用在对根元素的声明中-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT email (#PCDATA)>
]>
<root>
<name>JAMES</name>
<email>A@B.C</email>
<email>a@b.c</email>
<!-- 个数不受限制-->
;;;
</root>
03. 其他非关键字类型;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ELEMENT name (firstname, middename, lastname)>
<!ELEMENT firstname EMPTY>
<!ELEMENT middename EMPTY>
<!ELEMENT lastname EMPTY>
]>
<name>
<!--HELLO-->
<firstname/>
<middename/>
<lastname/>
</name>
注意:<!ELEMENT name (firstname,middename,lastname)> 表示定义name 元素只包
含括号内声明子元素,并且name 元素中不能含有字符串数据.括号内的逗号,决定了子
元素出现的顺序
04. 子元素和符号;
+:元素至少出现一次;
*:元素出现0 到多次;
?:元素出现0 或一次;
|:两个元素只出现一个
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (from?, to+, heading, (body | message))>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT message (#PCDATA)>
]>
<note>
<from>John</from>
<!-- 可以出现0或1次-->
<to>George</to>
<!-- 可以出现1到多次-->
<to>George</to>
<heading>Reminder</heading>
<!-- 必须出现且1次-->
<body>Don't forget the meeting!</body>
<!-- body 和message 只能出现一种. -->
<message>s</message>
</note>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (from, to, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<from>John</from>
<to>George</to>
<to>George</to>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(二) DTD详解;
2.DTD 简介;
文档类型定义(DTD)可定义合法的XML 文档构建模块。它使用一系列合法的元素来定
义文档的结构。
DTD 可被成行地声明于XML 文档中,也可作为一个外部引用。
3) 内部的DOCTYPE 声明;
假如DTD 被包含在您的XML 源文件中,它应当通过下面的语法包装在一个DOCTYPE
声明中:
<!DOCTYPE 根元素[元素声明]>带有DTD 的XML 文档实例(请在IE5 以及更高的版
本打开,并选择查看源代码):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
在您的浏览器中打开此XML 文件,并选择“查看源代码”命令。
以上DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是note 类型的文档。
!ELEMENT note (第三行)定义note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义to 元素为"#PCDATA" 类型
!ELEMENT from (第五行)定义frome 元素为"#PCDATA" 类型
!ELEMENT heading (第六行)定义heading 元素为"#PCDATA" 类型
!ELEMENT body (第七行)定义body 元素为"#PCDATA" 类型
4) 外部文档声明;
假如DTD 位于XML 源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE
定义中:
<!DOCTYPE 根元素SYSTEM "文件名">这个XML 文档和上面的XML 文档相同,但是拥
有一个外部的DTD: (在IE5 中打开,并选择“查看源代码”命令。)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<!--这是包含DTD 的"note.dtd" 文件:-->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
5) 为什么使用DTD?
通过DTD,您的每一个XML 文件均可携带一个有关其自身格式的描述。
通过DTD,独立的团体可一致地使用某个标准的DTD 来交换数据。
而您的应用程序也可使用某个标准的DTD 来验证从外部接收到的数据。
您还可以使用DTD 来验证您自身的数据。
3.DTD - XML 构建模块;
XML 以及HTML 文档的主要构建模块是类似<body>....</body> 这样的标签。
6) XML 文档构建模块;
所有的XML 文档(以及HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
7) 下面是每个构建模块的简要描述;
05. 元素;
元素是XML 以及HTML 文档的主要构建模块。
HTML 元素的例子是"body" 和"table"。XML 元素的例子是"note" 和"message" 。元素
可包含文本、其他元素或者是空的。空的HTML 元素的例子是"hr"、"br" 以及"img"。
实例:
<body>body text in between</body>
<message>somemessage in between</message>
06. 属性;
属性可提供有关元素的额外信息。
属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。下面的"img"
元素拥有关于源文件的额外信息:
[img]computer.gif[/img] 元素的名称是"img" 。属性的名称是"src" 。属性的值是
"computer.gif"。由于元素本身为空,它被一个" /" 关闭。
07. 实体;
实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个HTML 实体引用:" "。这个“无折行空格”实体在HTML 中
被用于在某个文档中插入一个额外的空格。
当文档被XML 解析器解析时,实体就会被展开。
下面的实体在XML 中被预定义:
实体引用字符;
< <
> >
& &
" "
' '
08. PCDATA;
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&、< 或者> 字符;需要使用&、< 以
及> 实体来分别替换它们。
09. CDATA;
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的
实体也不会被展开。
4.DTD 元素;
在一个DTD 中,元素通过元素声明来进行声明。
8) 声明一个元素;
在DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称类别>或者
<!ELEMENT 元素名称(元素内容)>
9) 空元素;
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称EMPTY>
例子:
<!ELEMENT br EMPTY>XML
例子:
10) 只有PCDATA 的元素;
只有PCDATA 的元素通过圆括号中的#PCDATA 进行声明:
<!ELEMENT 元素名称(#PCDATA)>
例子:
<!ELEMENT from(#PCDATA)>
11) 带有任何内容的元素;
通过类别关键词ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT 元素名称ANY>
例子:
<!ELEMENT note ANY>
12) 带有子元素(序列)的元素;
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称(子元素名称1)>或者
<!ELEMENT 元素名称(子元素名称1,子元素名称2,.....)>
例子:
<!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档
中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元
素的完整声明是:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>声明只出现一次的元素
例子:
<!ELEMENT 元素名称(子元素名称)>
<!ELEMENT note (message)>
上面的例子声明了:message 子元素必须出现一次,并且必须只在"note" 元素中出现一次。
13) 声明最少出现一次的元素;
<!ELEMENT 元素名称(子元素名称+)>
例E.._uc2子:Ó
<!ELEMENT note (message+)>
上面的例子中的加号声明了:message 子元素必须在"note" 元素内出现至少一次。
14) 声明出现零次或多次的元素;
<!ELEMENT 元素名称(子元素名称*)>
例子:
<!ELEMENT note (message*)>
上面的例子中的星号声明了:子元素message 可在"note" 元素内出现零次或多次。
15) 声明出现零次或一次的元素;
<!ELEMENT 元素名称(子元素名称?)>
例子:
<!ELEMENT note (message?)>上面的例子中的问号声明了:子元素message 可在"note" 元
素内出现零次或一次
16) 声明“非.../既...”类型的内容;
例子:
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含"to" 元素、"from" 元素、"header" 元素,以及
非"message" 元素既"body" 元素。
17) 声明混合型的内容;
例子:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的PCDATA、"to"、"from"、"header"
或者"message"。
5.DTD 属性;
在DTD 中,属性通过ATTLIST 声明来进行声明。
18) 声明属性;
属性声明拥使用下列语法:
<!ATTLIST 元素名称属性名称属性类型默认值>
DTD 实例:
<!ATTLIST payment type CDATA "check">
XML 实例:
<payment type="check" />
以下是属性类型的选项:
默认值参数可使用下列值:
19) 规定一个默认的属性值;
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的XML:
<square width="100" />
在上面的例子中,"square" 被定义为带有CDATA 类型的"width" 属性的空元素。如果宽度
没有被设定,其默认值为0 。
20) #IMPLIED
语法
<!ATTLIST 元素名称属性名称属性类型#IMPLIED>
例子
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的XML:
<contact fax="555-667788" />合法的XML:
<contact />假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词
#IMPLIED。
21) #REQUIRED;
语法
<!ATTLIST 元素名称属性名称属性类型#REQUIRED>例子
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的XML:
<person number="5677" />
非法的XML:
<person />假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词
#REQUIRED。
#FIXED
语法
<!ATTLIST 元素名称属性名称属性类型#FIXED "value">
例子
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的XML:
<sender company="Microsoft" />
非法的XML:
<sender company="W3School" />
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用#FIXED 关键词。如果作
者使用了不同的值,XML 解析器会返回错误。
列举属性值
语法:
<!ATTLIST 元素名称属性名称(en1|en2|..) 默认值>
DTD 例子:
<!ATTLIST payment type (check|cash) "cash">XML 例子:
<payment type="check" />或者
<payment type="cash" />
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。
6.DTD 实体;
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
22) 一个内部实体声明;
语法:
<!ENTITY 实体名称"实体的值">
例子:
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
注释: 一个实体由三部分构成: 一个和号(&), 一个实体名称, 以及一个分号(;)。
23) 一个外部实体声明;
语法:
<!ENTITY 实体名称SYSTEM "URI/URL">
例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
7.DTD 验证;
Internet Explorer 5.0 可根据某个DTD 来验证您的XML。
24) 通过XML 解析器进行验证;
当您试图打开某个XML 文档时,XML 解析器有可能会产生错误。通过访问parseError
对象,就可以取回引起错误的确切代码、文本甚至所在的行。
注释:load( ) 方法用于文件,而loadXML( ) 方法用于字符串。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)Try it Yourself
或者仅仅看一下这个XML 文件。
25) 关闭验证;
通过把XML 解析器的validateOnParse 设置为"false",就可以关闭验证。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)Try it Yourself
26) 通用的XML 验证器;
为了帮助您验证XML 文件,我们创建了此链接,这样你就可以验证任何XML 文件了。
parseError 对象
8.DTD 实例;
27) 电视节目表DTD;
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER, DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE, (HOLIDAY | PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME, TITLE, DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE
CDATA #REQUIRED
>
<!ATTLIST CHANNEL
CDATA #REQUIRED
>
<!ATTLIST PROGRAMSLOT
CDATA #IMPLIED
>
<!ATTLIST TITLE
CDATA #IMPLIED
CDATA #IMPLIED
>]
>
28) 报纸文章DTD;
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE, BYLINE, LEAD, BODY, NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE
CDATA #REQUIRED
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>
29) 产品目录DTD;
<!DOCTYPE CATALOG [
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT (SPECIFICATIONS+, OPTIONS?, PRICE+,
NOTES?)>
<!ATTLIST PRODUCT
CDATA #IMPLIED
(HandTool | Table | Shop-Professional) "HandTool"
CDATA #IMPLIED
(Pittsburgh | Milwaukee | Chicago) "Chicago"
(InStock | Backordered | Discontinued) "InStock"
>
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
(Metal | Polished | Matte) "Matte"
(Included | Optional | NotApplicable) "Included"
(HardShell | Soft | NotApplicable) "HardShell"
>
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
CDATA #IMPLIED
>
<!ELEMENT NOTES (#PCDATA)>
]>
9.DTD 总结;
(三) Schema;
XML Schema 是基于XML 的DTD 替代者。
XML Schema 描述XML 文档的结构。
XML Schema 语言也称作XML Schema 定义(XML Schema Definition,XSD)。
10. 概念:
XML Schema 的作用是定义XML 文档的合法构建模块,类似DTD。
XML Schema:
定义可出现在文档中的元素
定义可出现在文档中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
11. DTD可能被Schema取代的理由:
• XML Schema 可针对未来的需求进行扩展
• XML Schema 更完善,功能更强大
• XML Schema 基于XML 编写
• XML Schema 支持数据类型
• XML Schema 支持命名空间
12. 为什么要使用XML Schema;
XML Schema 比DTD 更强大;
30) XML Schema 支持数据类型;
XML Schema 最重要的能力之一就是对数据类型的支持。
通过对数据类型的支持:
10. 可更容易地描述允许的文档内容
11. 可更容易地验证数据的正确性
12. 可更容易地与来自数据库的数据一并工作
13. 可更容易地定义数据约束(data facets)
14. 可更容易地定义数据模型(或称数据格式)
15. 可更容易地在不同的数据类型间转换数据
31) XML Schema 使用XML 语法;
另一个关于XML Schema 的重要特性是,它们由XML 编写。
由XML 编写XML Schema 有很多好处:
16. 不必学习新的语言
17. 可使用XML 编辑器来编辑Schema 文件
18. 可使用XML 解析器来解析Schema 文件
19. 可通过XML DOM 来处理Schema
20. 可通过XSLT 来转换Schema
32) XML Schema 可保护数据通信;
当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。
通过XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。
一种数据,比如"03-11-2004",在某些国家被解释为11 月3 日,而在另一些国家为当
作3 月11 日。
但是一个带有数据类型的XML 元素,比如:<date type="date">2004-03-11</date>,可确保
对内容一致的理解,这是因为XML 的数据类型"date" 要求的格式是"YYYY-MM-DD"。
33) XML Schema 可扩展;
21. XML Schema 是可扩展的,因为它们由XML 编写。
22. 通过可扩展的Schema 定义,您可以:
23. 在其他Schema 中重复使用您的Schema
24. 创建由标准类型衍生而来的您自己的数据类型
25. 在相同的文档中引用多重的Schema
34) 形式良好是不够的;
我们把符合XML 语法的文档称为形式良好的XML 文档,比如:
26. 它必须以XML 声明开头
27. 它必须拥有唯一的根元素
28. 开始标签必须与结束标签相匹配
29. 元素对大小写敏感
30. 所有的元素都必须关闭
31. 所有的元素都必须正确地嵌套
32. 必须对特殊字符使用实体
即使文档的形式良好,仍然不能保证它们不会包含错误,并且这些错误可能会产生严重的后
果。
13. XSD 为何使用;
XML 文档可对DTD 或XML Schema 进行引用。
一个简单的XML 文档:
请看这个名为"note.xml" 的XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
DTD 文件:
下面这个例子是名为"note.dtd" 的DTD 文件,它对上面那个XML 文档的元素进行了定
义:
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
第1 行定义note 元素有四个子元素:"to, from, heading, body"。
第2-5 行定义了to, from, heading, body 元素的类型是"#PCDATA"。
35) XML Schema;
下面这个例子是一个名为"note.xsd" 的XML Schema 文件,它定义了上面那个XML 文档
的元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
note 元素是一个复合类型,因为它包含其他的子元素。其他元素(to, from, heading, body) 是
简易类型,因为它们没有包含其他元素。您将在下面的章节学习更多有关复合类型和简易类
型的知识。
36) 对DTD 的引用;
此文件包含对DTD 的引用:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
37) 对XML Schema 的引用;
此文件包含对XML Schema 的引用:
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
38) XSD <schema> ;
<schema> 元素是每一个XML Schema 的根元素。
39) <schema> 元素;
<schema> 元素是每一个XML Schema 的根元素:
<?xml version="1.0"?>
<xs:schema>
…… </xs:schema>
<schema> 元素可包含属性。一个schema 声明往往看上去类似这样:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn" elementFormDefault="qualified">
...
...
</xs:schema>
代码解释:
下面的片断:
xmlns:xs="http://www.w3.org/2001/XMLSchema"显示schema 中用到的元素和数据类型来自
命名空间"http://www.w3.org/2001/XMLSchema" 。同时它还规定了来自命名空间
"http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀xs:
这个片断:
targetNamespace="http://www.w3school.com.cn" 显示被此schema 定义的元素(note, to,
from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。
这个片断:
xmlns="http://www.w3school.com.cn" 指出默认的命名空间是
"http://www.w3school.com.cn"。
这个片断:
elementFormDefault="qualified" 指出任何XML 实例文档所使用的且在此schema 中声明
过的元素必须被命名空间限定。
40) 在XML 文档中引用Schema;
此XML 文档含有对XML Schema 的引用:
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
代码解释:
下面的片断:
xmlns="http://www.w3school.com.cn" 规定了默认命名空间的声明。此声明会告知schema
验证器,在此XML 文档中使用的所有元素都被声明于"http://www.w3school.com.cn" 这个
命名空间。
一旦您拥有了可用的XML Schema 实例命名空间:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 您就可以使用schemaLocation 属
性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的
XML schema 的位置:
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
41) 简单的类型;
XML Schema 可定义XML 文件的元素。
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。
14. 什么是简易元素?
简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。
不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是XML Schema
定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定
制类型。
您也可向数据类型添加限定(即facets),以此来限制它的内容,或者您可以要求数据
匹配某种特定的模式。
42) 定义简易元素;
定义简易元素的语法:
<xs:element name="xxx" type="yyy"/>此处xxx 指元素的名称,yyy 指元素的数据类型。XML
Schema 拥有很多内建的数据类型。
最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
例子:
这是一些XML 元素:
<?xml version="1.0" encoding="UTF-8"?>
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn><!--这是相应的简易元素定义:-->
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
43) 简易元素的默认值和固定值;
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"red":
<xs:element name="color" type="xs:string" default="red"/>固定值同样会自动分配给元素,并
且您无法规定另外一个值。
在下面的例子中,固定值是"red":
<xs:element name="color" type="xs:string" fixed="red"/>
15. XSD 属性;
所有的属性均作为简易类型来声明。
44) 什么是属性?
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本
身总是作为简易类型被声明的。
45) 如何声明属性?
定义属性的语法是:
<xs:attribute name="xxx" type="yyy"/>在此处,xxx 指属性名称,yyy 则规定属性的数据类型。
XML Schema 拥有很多内建的数据类型。
33. 最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
实例
这是带有属性的XML 元素:
<lastname lang="EN">Smith</lastname>这是对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>
46) 属性的默认值和固定值;
属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是"EN":
<xs:attribute name="lang" type="xs:string" default="EN"/>固定值同样会自动分配给元素,并且
您无法规定另外的值。
在下面的例子中,固定值是"EN":
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
47) 可选的和必需的属性;
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用"use" 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
48) 对内容的限定;
当XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如XML 元素的类型是"xs:date",而其包含的内容是类似"Hello World" 的字符串,元素
将不会(通过)验证。
通过XML schema,您也可向您的XML 元素及属性添加自己的限定。这些限定被称为facet
16. XSD 限定;
限定(restriction)用于为XML 元素或者属性定义可接受的值。对XML 元素的限定被
称为facet。
49) 对值的限定;
下面的例子定义了带有一个限定且名为"age" 的元素。age 的值不能低于0 或者高于
120:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
50) 对一组值的限定;
如需把XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration
constraint)。
下面的例子定义了带有一个限定的名为"car" 的元素。可接受的值只有:Audi, Golf, BMW:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
上面的例子也可以被写为:
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</element>
注释:在这种情况下,类型"carType" 可被其他元素使用,因为它不是"car" 元素的组成部
分。
51) 对一系列值的限定;
如需把XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束
(pattern constraint)。
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值只有小写字母a - z 其
中的一个:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"initials" 的元素。可接受的值是大写字母A - Z 其
中的三个:
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子也定义了带有一个限定的名为"initials" 的元素。可接受的值是大写或小写字母
a - z 其中的三个:
<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"choice 的元素。可接受的值是字母x, y 或z 中的
一个:
<xs:element name="choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为"prodid" 的元素。可接受的值是五个阿拉伯数字的
一个序列,且每个数字的范围是0-9:
<xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
52) 对一系列值的其他限定;
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值是a - z 中零个或多个
字母:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"letter" 的元素。可接受的值是一对或多对字母,每
对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,
但是"Stop"、"STOP" 或者"stop" 无法通过验证:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"gender" 的元素。可接受的值是male 或者
female:
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为"password" 的元素。可接受的值是由8 个字符组
成的一行字符,这些字符必须是大写或小写字母a - z 亦或数字0 - 9:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
53) 对空白字符的限定;
如需规定对空白字符(whitespace characters)的处理方式,我们需要使用whiteSpace 限定。
下面的例子定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"preserve",这意味着XML 处理器不会移除任何空白字符:
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"replace",这意味着XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"address" 的元素。这个whiteSpace 限定被设置为
"collapse",这意味着XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被
替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
54) 对长度的限定;
如需限制元素中值的长度,我们需要使用length、maxLength 以及minLength 限定。
本例定义了带有一个限定且名为"password" 的元素。其值必须精确到8 个字符:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为"password" 的元素。其值最小为5 个字符,最大
为8 个字符:
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
55) 数据类型的限定;
56) 复杂的类型;
复合元素包含了其他的元素及/或属性。
57) 什么是复合元素?
复合元素指包含其他元素及/或属性的XML 元素。
34. 有四种类型的复合元素:
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
注释:上述元素均可包含属性!
复合元素的例子
复合元素,"product",是空的:
<product pid="1345"/>
复合元素,"employee",仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
复合元素,"food",仅包含文本:
<food type="dessert">Ice cream</food>
复合元素,"description",包含元素和文本:
<description>happened on <date lang="norwegian">03.03.99</date> ....
</description>
58) 如何定义复合元素?
请看这个复合XML 元素,"employee",仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
59) 在XML Schema 中,我们有两种方式来定义复合元素:
1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
假如您使用上面所描述的方法,那么仅有"employee" 可使用所规定的复合类型。请注意其
子元素,"firstname" 以及"lastname",被包围在指示器<sequence>中。这意味着子元素必
须以它们被声明的次序出现。您会在XSD 指示器这一节学习更多有关指示器的知识。
2. "employee" 元素可以使用type 属性,这个属性的作用是引用要使用的复合类型的名称:
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
17. XSD 仅含元素;
“仅含元素”的复合类型含有一个仅包含其他元素的元素。
60) 复合类型仅包含元素;
XML 元素,"person",仅包含其他的元素:
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</person>您可在schema 中这样定义"person" 元素:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
请留意这个<xs:sequence>。它意味着被定义的元素必须按上面的次序出现在"person" 元
素中。
或者您可以为complexType 元素设定一个名称,并让"person" 元素的type 属性来引用此
名称(如使用此方法,若干元素均可引用相同的复合类型):
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
61) XSD 仅含文本;
62) XSD 混合内容
63) XSD 指示器;
64) XSD <any> ;
65) XSD <anyAttribute>
66) XSD 元素替换;
67) XSD 实例;
18. 数据类型;
68) XSD 字符串;
69) XSD 日期;
70) XSD 数值;
71) XSD 杂项;
72) XSD 总结;