




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章使用DTD定义有效的XML文档3.1DTD的作用和基本结构3.2XML中引用DTD3.3使用DTD声明XML元素3.4使用DTD声明XML属性3.5DTD中定义和引用实体3.6综合实例3.7本章小结习题3
3.1DTD的作用和基本结构
DTD是文档类型定义,其中规定XML文档中的元素、属性、标记、文档中的实体及其相互关系。DTD为XML文档结构制定了一套规则。例如,一项DTD指定一个BOOK元素有一个ISBN子元素、一个TITLE子元素、一个或多个AUTHOR子元素,有或没有SUBTITLE等。3.1.1DTD的作用
DTD可以为应用程序提供一种统一的XML文档格式。XML的可扩展性虽然提供了很高的灵活性,但有时需要文档格式统一。例如,为了使一部书易于排版,出版商会要求作者遵循一定的格式。如果作者用XML写作,那么出版商就能很容易地检查出作者是否遵守了DTD定义的预定格式,甚至找出作者在哪里以及怎样偏离了格式。
DTD有助于数据交流和共享。如果指定DTD,依靠清晰、准确的语法定义文档,程序员就不必为了理解XML文档而与文档的设计者面对面地交流。这些规则也形成了一种可靠的错误监测机制,程序员或解析器可以由此查找可能的错误。
DTD可以使用户脱离实际数据就能知道文档的逻辑结构。这意味着可以将不同的样式和格式加在基本结构上,而对基本结构毫无损害。
DTD可以验证数据的有效性。一个合法的文档必须符合DTD指定的约束条件,而且它的基本元素必须是在文档类型声明中指定的。只有符合DTD规则的XML文档才是有效的文档。3.1.2DTD的基本结构
XML文档由元素和相应的属性组成。虽然我们还可以定义其他项,但元素和属性是组成XML文档的两个主要的要素。此外,元素的内容是通过其他元素或XML标准中规定的基本类型进行定义的。DTD必须能够定义文档中的所有元素、元素可以设置的属性以及元素之间的关系。下面通过一个案例来说明DTD文档的基本结构。【例3-1】
案例说明:DTD的基本结构。
程序名称:ch3-1.dtd
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!ENTITYContent"关于学习软件开发的图书信息列表">
03 <!ELEMENTAnnotation(#PCDATA)>
04 <!ELEMENTTitle(#PCDATA)>
05 <!ELEMENTAbstract(#PCDATA)>
06 <!ELEMENTAuthor(#PCDATA)>07 <!ELEMENTPublisher(#PCDATA)>
08 <!ELEMENTPubDate(#PCDATA)>
09 <!ELEMENTPrice(#PCDATA)>
10 <!ELEMENTCategory(#PCDATA)>
11 <!ELEMENTBook(Title,Abstract,Author,Category,Publisher,PubDate,Price)>
12 <!ELEMENTBookList(Annotation,Book,Book)>
13 <!--"ISBN国际标准书号,唯一标识图书,定义为Book的属性"-->
14 <!ATTLISTBook ISBNCDATA"7-5606-0492-7">案例分析:DTD文档ch3-1.dtd定义了一个XML文档中所有元素属性和实体,用于描述图书信息。
从第01行可以看出DTD文档也是从XML声明开始的。DTD验证是从SGML继承来的一种验证机制,在DTD中使用XML声明,可将XML的DTD和SGML的DTD区分开来,说明本文档用于定义XML文档,而不是定义SGML文档。该声明语句可以省略。第02行定义了一个实体标记Content。案例ch3-1.xml的第03行引用了该实体,在浏览器中执行XML文档,Content实体将被DTD中定义的具体内容“关于学习软件开发的图书信息列表”替换。XML文档本体中定义的所要引用的实体必须在DTD中定义。
第03行至第12行为元素定义,定义XML文档需要使用的所有元素标记的名称、相互关系、元素的可取值等。它们决定了XML文档的结构。
第13行为DTD中的注释。注释以“<!--”开始,以“-->”结束,这与XML文档中的注释格式一致。
第14行为元素的属性定义。元素中的属性必须在DTD中说明。由上述DTD文档定义的XML文档可以用例3-2中的ch3-1.xml程序进行描述,XML文档定义如下:
【例3-2】
案例说明:描述图书信息的XML。
程序名称:ch3-1.xml
01
<?xmlversion=“1.0”encoding=“UTF-8”?>
02
<BookList>
03 <Annotation>&Content;</Annotation>
04 <BookISBN="7-5606-0924-4">05
<Title>软件工程</Title>
06
<Abstract>介绍软件工程理论...</Abstract>
07
<Author>邓良松</Author>
08
<Category>计算机</Category>
09
<Publisher>西安电子科技大学出版社</Publisher>
10
<PubDate>2001年6月</PubDate>
11
<Price>20.00</Price>
12 </Book>
13 <BookISBN="7-5606-0492-7">14
<Title>软件系统开发技术(修订版)</Title>
15
<Abstract>介绍软件系统的开发技术...</Abstract>
16
<Author>潘锦平,施小英</Author>
17
<Category>计算机</Category>
18
<Publisher>西安电子科技大学出版社</Publisher>
19
<PubDate>2001年1月</PubDate>
20
<Price>12.30</Price>
21
</Book>
22
</BookList>
3.2XML中引用DTD
DTD是与文档相关的。通常,文档中包含一条用于与DTD建立关联的指令,当验证有效性的解析器读到该指令时,它获取DTD,并根据其中定义的规则对文档进行检验。DTD声明可以包含在XML中,也可以存在于独立的DTD文档中。下面分别介绍这两种DTD的引用方式。3.2.1内部引用方式
内部引用方式将DTD直接嵌入到XML文档内部,在XML文档本体中对文档的元素、属性或实体进行DTD声明。嵌入到XML文档内部的DTD声明不能重复使用。例3-3中程序ch3-2.xml采用了内部引用DTD方式进行XML文档定义。【例3-3】
案例说明:内部DTD引用。
程序名称:ch3-2.xml
01
<?xmlversion=“1.0”encoding=“UTF-8”?>
02
<!DOCTYPEBookList[
03 <!ENTITYContent"关于学习软件开发的图书信息列表">
04 <!ELEMENTAnnotation(#PCDATA)>
05 <!ELEMENTTitle(#PCDATA)>
06 <!ELEMENTAbstract(#PCDATA)>
07 <!ELEMENTAuthor(#PCDATA)>08 <!ELEMENTPublisher(#PCDATA)>
09 <!ELEMENTPubDate(#PCDATA)>
10 <!ELEMENTPrice(#PCDATA)>
11 <!ELEMENTCategory(#PCDATA)>
12
<!ELEMENTBook(Title,Abstract,Author,Category,Publisher,PubDate,Price)>
13 <!ELEMENTBookList(Annotation,Book,Book)>
14 <!--"ISBN国际标准书号,唯一标识图书,定义为Book的属性"-->
15 <!ATTLISTBookISBNCDATA"7-5606-0492-7">
16 ]>17
<BookList>
18 <Annotation>&Content;</Annotation>
19 <BookISBN=“7-5606-0924-4”>
20
<Title>软件工程</Title>
21
<Abstract>介绍软件工程理论...</Abstract>
22
<Author>邓良松</Author>
23
<Category>计算机</Category>
24
<Publisher>西安电子科技大学出版社</Publisher>
25
<PubDate>2001年6月</PubDate>
26
<Price>20.00</Price>27 </Book>
28 <BookISBN=“7-5606-0492-7”>
29
<Title>软件系统开发技术(修订版)</Title>
30
<Abstract>介绍软件系统的开发技术...</Abstract>
31
<Author>潘锦平,施小英</Author>
32
<Category>计算机</Category>
33
<Publisher>西安电子科技大学出版社</Publisher>
34
<PubDate>2001年1月</PubDate>
35
<Price>12.30</Price>
36 </Book>
37
</BookList>案例分析:在例3-3中的ch3-2.xml的第02行DOCTYPE标记为文档类型定义指令。DOCTYPE声明位于XML文档的序言区。DOCTYPE声明必须位于第01行XML声明之
后,且位于第17行XML文档根元素之前。XML声明和DOCTYPE声明之间可以插入注释和处理指令。
DOCTYPE声明的基本结构为:<!DOCTYPE根元素名称[DTD的内容]>。DOCTYPE声明包含关键字DOCTYPE、文档根元素的名称以及内容声明结构。关键字DOCTYPE必须大写。
DTD是起始于“<!DOCTYPE根元素名称[”而终止于“]>”之间的所有内容,但不包括“<!DOCTYPE根元素名称[”和“]>”。程序ch3-2.xml中第3行至第15行为DTD的内容。3.2.2外部引用方式
对XML元素、属性或实体等的声明可以包含在一个单独的DTD文件中,文件的扩展名为“.dtd”。外部引用DTD方式将XML文档以外的独立DTD文档和当前的XML文档关联起来。外部引用方式比较灵活,可重复利用同一份DTD文档,并使应用系统易于同步更新及管理。引用外部DTD文件有两种方式:SYSTEM引用方式和PUBLIC引用方式。SYSTEM引用方式主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。PUBLIC引用方式主要用于引用一个由权威机构制定的、提供给特定行业或公众使用的DTD。下面分别介绍这两种DTD引用方式。
1.SYSTEM引用方式
SYSTEM声明外部DTD的方式表示DTD是私有的。外部DTD声明的语法格式为:
<!DOCTYPE根元素名称SYSTEM“DTD_URL”>
上述语法格式说明如下:
(1)“<!”表示一条指令的开始,“>”表示指令的结束。DOCTYPE表示指令为文件类型定义指令。
(2) SYSTEM和DOCTYPE都是关键字,必须大写。
(3)“DTD_URL”指外部DTD文件的URI或文件路径,可以是相对路径,也可以是绝对路径,指示XML处理器可在该位置取得DTD文档。
(4)该语句必须出现在XML文档的序言区。【例3-4】
案例说明:外部DTD文件的SYSTEM引用方式。
程序名称:ch3-3.xml
01
<?xmlversion=“1.0”encoding=“UTF-8”standalone=“no”?>
02
<!DOCTYPEBookListSYSTEM“D:\XML\examples\ch3-1.dtd”>
03
<BookList>
04 <Annotation>&Content;</Annotation>
05 <BookISBN="7-5606-0924-4">06 <Title>软件工程</Title>
07 <Abstract>介绍软件工程理论...</Abstract>
08 <Author>邓良松</Author>
09 <Category>计算机</Category>
10 <Publisher>西安电子科技大学出版社</Publisher>
11 <PubDate>2001年6月</PubDate>
12 <Price>20.00</Price>
13
</Book>
14
<BookISBN="7-5606-0492-7">15
<Title>软件系统开发技术(修订版)</Title>
16
<Abstract>介绍软件系统的开发技术...</Abstract>
17
<Author>潘锦平,施小英</Author>
18
<Category>计算机</Category>
19
<Publisher>西安电子科技大学出版社</Publisher>
20
<PubDate>2001年1月</PubDate>
21
<Price>12.30</Price>
22 </Book>
23
</BookList>案例分析:例3-4中的程序ch3-3.xml使用SYSTEM关键字引用外部DTD文件ch3-1.dtd验证XML文档。第01行XML声明语句中的standalone属性取“no”值。第02行中“D:\XML\examples\ch3-1.dtd”说明被引用的外部DTD文档ch3-1.dtd位于D:\XML\examples目录下。
如果XML文档和外部DTD文件在同一目录下,可以不写目录路径,采用相对路径引用,如<!DOCTYPEBookListSYSTEM“ch3-1.dtd”>。
如果外部DTD文件位于Web服务器上,则需要使用URI定位Web服务器的外部DTD资源。如:<!DOCTYPEBookListSYSTEM"/dtd/ch3-1.dtd">。
2.PUBLIC引用方式
PUBLIC声明外部DTD的方式表示DTD是公共的。公共DTD一般用于行业标准。DTD声明的语法格式为:
<!DOCTYPE根元素名称PUBLIC“DTD_Name”“DTD_URL”>
上述语法格式说明如下:
(1)“<!DOCTYPE”为文档类型声明的开始,“>”为文档类型声明的结束。
(2)“PUBLIC”为关键字,必须大写,并表明该外部DTD具有名称。
(3)“DTD_Name”为XML文档所引用的外部公共DTD的名称。
(4)“DTD_URL”为外部DTD文件的路径,含义与SYSTEM引用方式中的“DTD_URL”一致。
(5)该语句必须出现在XML文档的序言区。公共DTD的名称(DTD_Name)构成要遵循如下约定:
(1)要表明来源:如果DTD是由ISO发布的标准DTD,则名称前要冠以“ISO”字符串;如果DTD是由ISO之外的标准组织发布的标准DTD,则名称前要冠以“+”字符;如果不是标准的组织或者个人所发布的DTD,则名称前要冠以“-”字符。
(2)要表明拥有者:在名称中要包含一个表明DTD所有者的字符串。
(3)要表明主要内容:在名称中要包含一个表明DTD主要内容或者类别的字符串。
(4)要表明所使用的语言:在名称的尾部要包含一个表明所使用的语言标志(英语用EN说明,法文用FR说明,德文用DE说明,中文用ZH说明等),该语言标志必须是由ISO639所定义过的标准标志。
(5)分隔符:上述内容之间要以两个斜线符号“//”分隔。
(6)顺序:上述内容在名称中出现的顺序与上述顺序相同。【例3-5】
案例说明:外部DTD文件的PUBLIC引用方式。
程序名称:ch3-4.xml
01 <?xmlversion=“1.0”encoding=“UTF-8”standalone=“no”?>
02<!DOCTYPEBookListPUBLIC"-//ZWM//BookXMLVersion1.0//ZH""D:\XML\examples\ch3-1.dtd">
03 <BookList>
04 <Annotation>&Content;</Annotation>
05 <BookISBN="7-5606-0924-4">06 <Title>软件工程</Title>
07 <Abstract>介绍软件工程理论...</Abstract>
08 <Author>邓良松</Author>
09 <Category>计算机</Category>
10 <Publisher>西安电子科技大学出版社</Publisher>
11 <PubDate>2001年6月</PubDate>
12 <Price>20.00</Price>
13 </Book>
14 <BookISBN="7-5606-0492-7">15
<Title>软件系统开发技术(修订版)</Title>
16
<Abstract>介绍软件系统的开发技术...</Abstract>
17
<Author>潘锦平,施小英</Author>
18
<Category>计算机</Category>
19
<Publisher>西安电子科技大学出版社</Publisher>
20
<PubDate>2001年1月</PubDate>
21
<Price>12.30</Price>
22 </Book>
23</BookList>案例分析:第02行中PUBLIC关键词后的DTD名称“-//ZWM//BookXMLVersion1.0//ZH”的含义是:由非标准组织发布的、编写者的标志是ZWM、关于图书信息且用中文编写的DTD文档。3.2.3内外结合的引用方式
内部引用DTD和外部引用DTD两种引用方式可以结合使用,目的是使用内部DTD声明补充或重写引用的外部DTD。外部DTD由URL指定,声明方式可以是SYSTEM引用或PUBLIC引用,而内部DTD则由DTD直接指定。【例3-6】
案例说明:可扩展的DTD文档。
程序名称:ch3-2.dtd
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!ENTITYContent"关于学习软件开发的图书信息列表">
03 <!ELEMENTAnnotation(#PCDATA)>
04 <!ELEMENTTitle(#PCDATA)>
05 <!ELEMENTAbstract(#PCDATA)>
06 <!ELEMENTAuthor(#PCDATA)>
07 <!ELEMENTPublisher(#PCDATA)>08 <!ELEMENTPrice(#PCDATA)>
09 <!ELEMENTCategory(#PCDATA)>
10 <!ELEMENTBook(Title,Abstract,Author,Category,Publisher,PubDate,Price)>
11 <!ELEMENTBookList(Annotation,Book,Book)>
12 <!--"ISBN国际标准书号,唯一标识图书,定义为Book的属性"-->
13 <!ATTLISTBook ISBNCDATA"7-5606-0492-7">案例分析:定义图书的出版日期(PubDate)标签时,可以将“年-月”整体作为PubDate的数据,也可以将它们分开为Year和Month两个单独的标签作为PubDate的子元素。例3-6中的ch3-2.dtd的第10行将PubDate声明为Book的子元素,但PubDate本身是否包含子元素或数据,不再进行进一步声明,留给用户扩展。【例3-7】
案例说明:同时使用内部和外部DTD定义XML文档。
程序名称:ch3-5.xml
01 <?xmlversion="1.0"encoding="UTF-8"standalone="no"?>
02 <!DOCTYPEBookListSYSTEM"ch3-2.dtd"[
03 <!ELEMENTPubDate(Year,Month)>
04 <!ELEMENTYear(#PCDATA)>
05 <!ELEMENTMonth(#PCDATA)>
06 ]>
07 <BookList>08 <Annotation>&Content;</Annotation>
09 <BookISBN="7-5606-0924-4">
10 <Title>软件工程</Title>
11 <Abstract>介绍软件工程理论...</Abstract>
12 <Author>邓良松</Author>
13 <Category>计算机</Category>
14 <Publisher>西安电子科技大学出版社</Publisher>
15 <PubDate>
16
<Year>2001</Year>
17
<Month>6</Month>
18 </PubDate>
19 <Price>20.00</Price>
20 </Book>
21 <BookISBN="7-5606-0492-7">
22 <Title>软件系统开发技术(修订版)</Title>
23 <Abstract>介绍软件系统的开发技术...</Abstract>
24 <Author>潘锦平,施小英</Author>
25 <Category>计算机</Category>26
<Publisher>西安电子科技大学出版社</Publisher>
27
<PubDate>
28 <Year>2001</Year>
29 <Month>1</Month>
30
</PubDate>
31
<Price>12.30</Price>
32 </Book>
33 </BookList>案例分析:第02行引用外部DTD文件,第03行至第05行引用内部DTD对PubDate标记重新定义。PubDate包含两个子元素,即Year和Month。3.2.4检验XML文档的有效性
在DTD中规定了XML文档可使用的元素、属性、实体以及文档结构后,就可以使用该DTD验证XML文档。DTD主要是从以下几个方面检验XML文档的有效性。
(1)发现XML文档标签的拼写错误。例如,在XML文档中有几万个相同标签,其中若干个标签拼写错了,DTD验证很容易发现。
(2)检查XML文档的结构是否符合规定的标准。例如,检查外部程序传入的XML文档元素的先后顺序是否符合DTD规定的顺序,元素是否有属性或含有子元素等。
(3)检查是否使用了规定的标签编写XML文档。例如,在编写描述图书信息的XML文档时,DTD中没有定义描述出版商电话信息的标签,而编写XML时使用了定义出版商电话信息的标签,DTD很容易检查出来。
3.3使用DTD声明XML元素
使用DTD约束XML文档时,XML文档中所有元素必须在DTD中进行声明。声明内容为元素的名称以及元素包含的内容和所具有的属性。3.3.1元素的声明
DTD遵循W3C的语法约定,DTD中使用ELEMENT关键字为每个元素指定语法规则。ELEMENT用于声明XML文档中可用的元素以及该元素的使用方式。使用ELEMENT声明XML元素的语法为:
<!ELEMENTElement_NameContent_Model>上述语法说明如下:
(1)元素声明以“<!”开始,以“>”结束。
(2)元素声明指令“ELEMENT”为关键字,必须大写。
(3) Element_Name为要声明的元素的名称。
(4) Content_Model为元素内容格式的定义。元素的内容格式有多种。
1.基本元素声明
基本元素的内容为字符数据,不含子元素。如案例ch3-1.dtd的第03行至第10行:
03 <!ELEMENTAnnotation(#PCDATA)>
04 <!ELEMENTTitle(#PCDATA)>
05 <!ELEMENTAbstract(#PCDATA)>
06 <!ELEMENTAuthor(#PCDATA)>
07 <!ELEMENTPublisher(#PCDATA)>
08 <!ELEMENTPubDate(#PCDATA)>
09 <!ELEMENTPrice(#PCDATA)>
10 <!ELEMENTCategory(#PCDATA)>
以上8个元素的内容都为字符数据。
2.复合元素声明
复合元素的内容包含子元素。如案例ch3-1.dtd中的第11行:
11 <!ELEMENTBook(Title,Abstract,Author,Category,Publisher,PubDate,Price)>
Book元素包含了第03行至第10行定义的8个子元素,且在XML文档中这8个子元素必须按Book中声明的先后次序出现,次序不可颠倒。
3.根元素声明
根元素为XML文档中最外层的元素,包含了DTD中定义的其他所有元素。如案例ch3-1.dtd中的第12行:
12
<!ELEMENTBookList(Annotation,Book,Book)>
其中,BookList元素为XML文档的根元素,它包含一个Annotation元素和两个Book元素。3.3.2元素内容的控制
使用ELEMENT关键字声明元素,可以对元素的内容格式(Content_Model)进行控制。元素的内容有多种模型,下面具体介绍。
1.#PCDATA(可解析的字符数据)
DTD中所有非标签文本被称为可解析字符数据(ParserCharacterDATA),在元素声明中缩写为#PCDATA。PCDATA为关键字,需要大写。可解析字符数据只包含简单的字符数据,不包含标签文本。例如,DTD片段<!ELEMENTTitle(#PCDATA)>定义了一个标签<Title>,标签的内容为文本字符。该DTD片段对应的XML文档片段为:<Title>软件工程</Title>。
2.ANY(可包含任何内容)
ANY指定元素包含任何子元素或文本内容,且没有顺序的限制,相当于该元素的内容没有任何限制。ANY为关键字,需要大写。
【例3-8】
案例说明:可包含任何元素或文本的内容模型。
程序名称:ch3-6.xml
01 <?xmlversion=“1.0”encoding=“UTF-8”?>
02 <!DOCTYPEStudentList[03
<!ELEMENTStudentANY>
04
<!ELEMENTStudentList(Student,Student)>
05 ]>
06 <StudentList>
07
<Student/>
08
<Student>软英051班学生</Student>
09 </StudentList>案例分析:第03行Student元素内容声明为ANY,则该元素的内容不受限制。对应的第07行为空元素,第08行元素含有文本。
3.EMPTY(空元素)
EMPTY指定元素不能包含子元素或文本内容。EMPTY是声明语句的关键字,必须大写。例如,DTD片段<!ELEMENTAliasEMPTY>声明一个元素<Alias>,内容为空。该DTD片段对应的XML片段为<Alias></Alias>或者<Alias/>。
4.元素的顺序关系
使用序列可以指定元素中包含什么子元素,且以何种顺序出现。序列是一个以逗号分隔的元素名称列表,用来告诉XML处理器定义的元素中必须出现什么元素,且以何种顺序出现。序列的格式如下:
<!ELEMENT元素名称(子元素1,子元素2,子元素3,…)>
XML中的“子元素1”、“子元素2”、“子元素3”等子元素必须按先后顺序出现。在子元素后面可以跟“*”、“+”和“?”修饰符,指定子元素出现的次数。如果没有修饰符,则该元素必须出现一次。修饰符的含义如下:
(1)“*”表示该元素出现0次或多次,即任意次。
(2)“+”表示该元素必须至少出现一次。
(3)“?”表示该元素只能出现0次或1次。【例3-9】
案例说明:控制子元素出现顺序及出现次数。
程序名称:ch3-7.xml
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPEBookList[
03 <!ENTITYContent"关于学习软件开发的图书信息列表">
04 <!ELEMENTAnnotation(#PCDATA)>
05 <!ELEMENTTitle(#PCDATA)>
06 <!ELEMENTAbstract(#PCDATA)>
07 <!ELEMENTAuthor(#PCDATA)>08 <!ELEMENTPublisher(#PCDATA)>
09 <!ELEMENTPubDate(#PCDATA)>
10 <!ELEMENTPrice(#PCDATA)>
11 <!ELEMENTCategory(#PCDATA)>
12 <!ELEMENTISBN(#PCDATA)>
13 <!ELEMENTBook(Title,Abstract?,Author+,Category,Publisher,PubDate,Price,ISBN)>
14 <!ELEMENTBookList(Annotation,Book*)>
15 ]>
16 <BookList>17 <Annotation>&Content;</Annotation>
18 <Book>
19
<Title>软件工程</Title>
20
<Abstract>介绍软件工程理论...</Abstract>
21
<Author>邓良松</Author>
22
<Author>刘海岩</Author>
23
<Category>计算机</Category>
24
<Publisher>西安电子科技大学出版社</Publisher>
25
<PubDate>2001年6月</PubDate>
26
<Price>20.00</Price>
27
<ISBN>7-5606-0924-4</ISBN>28 </Book>
29 <Book>
30
<Title>软件系统开发技术(修订版)</Title>
31
<Author>潘锦平</Author>
32
<Category>计算机</Category>
33
<Publisher>西安电子科技大学出版社</Publisher>
34
<PubDate>2001年1月</PubDate>
35
<Price>12.30</Price>
36
<ISBN>7-5606-0492-7</ISBN>
37 </Book>
38
</BookList>案例分析:第13行Book元素的子元素Title、Abstract、Author、Category、Publisher、PubDate、Price、ISBN的声明规定了XML文档的标签是有序的。第19行至第27行以及第30行至第36行的元素必须按DTD中定义的次序出现,不可颠倒。
第14行Book元素后跟“*”控制符,表示Book元素可以是0个或任意多个,案例中为2个,描述了两本书的信息。第13行Author子元素后跟“+”控制符,表示书的编著者至少有一个。案例中“软件工程”的编著者有两个即“邓良松”和“刘海岩”,由第21行和第22行的Author子元素描述。“软件系统开发技术(修订版)”的编著者有一个即“潘锦平”,由第31行的子元素Author描述。
第13行的子元素Abstract后跟“?”控制符,表示图书的摘要描述可以没有,或者仅有一个。案例中“软件工程”有一个摘要,由第20行的Abstract子元素描述。图书“软件系统开发技术(修订版)”没有提供摘要描述。
5.元素的选择关系
有时需要在两个或多个互斥的元素中进行选择。例如,在一项描述顾客购物的DTD中,结帐方式信息中的每项Payment元素都有Credit_Card子元素或Cash子元素以便提供付款方式的信息,即采用信用卡支付还是现金支付。然而,单独的Payment元素不能同时使用两者,只能选择一种支付方式。在父元素声明中,可以使用竖线“|”而不是逗号来分开子元素,以便指明文档作者需要输入一个或另一个子元素。
选择性元素还可以和元素出现次数的控制符组合使用,实现对元素内容的灵活控制。【例3-10】
案例说明:描述顾客购物DTD中付款方式信息的选择。
程序名称:ch3-3.dtd
01 <?xmlversion=“1.0”encoding=“UTF-8”?>
02 <!ELEMENTCash(#PCDATA)>
03 <!ELEMENTCredit_Card(#PCDATA)>
04 <!ELEMENTPayment(Cash|Credit_Card)>
案例分析:第02行声明现金支付金额标签,第03行声明信用卡支付金额标签,第04行声明支付方式为现金支付或信用卡支付。【例3-11】
案例说明:选择性元素和修饰控制符的组合使用。
程序名称:ch3-8.xml
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPEOrder[
03 <!ELEMENTOrderID(#PCDATA)>
04 <!ELEMENTBookName(#PCDATA)>
05 <!ELEMENTNumber(#PCDATA)>
06 <!ELEMENTUnitPrice(#PCDATA)>07 <!ELEMENTCash(#PCDATA)>
08 <!ELEMENTCredit_Card(#PCDATA)>
09 <!ELEMENTBooks(BookName,Number,
UnitPrice)>
10 <!ELEMENTOrder(OrderID,Books+,(Cash|Credit_Card)?)>
11 ]>
12 <Order>
13 <OrderID>1000001</OrderID>
14 <Books>
15 <BookName>软件工程</BookName>16
<Number>1</Number>
17
<UnitPrice>20.00</UnitPrice>
18 </Books>
19 <Books>
20
<BookName>软件系统开发技术(修订版)</BookName>
21
<Number>1</Number>
22
<UnitPrice>12.30</UnitPrice>
23 </Books>
24 <Cash>32.30</Cash>
25 </Order>案例分析:第09行声明订购图书的基本信息,包括书名(BookName)、订购数量(Number)和单价(UnitPrice)。第10行声明订单的基本信息,包括订单号(OrderID)、图书(Books)和应付款金额。其中,Books使用了“+”修饰符,表示一份购书订单至少包含一本图书。应付款组合使用了“|”和“?”控制符,表示Cash和Credit_Card都不选(如赠书)或只选其中一个。程序ch3-8.xml中订单编号为1000001的订单订购了两本图书,采用现金支付(Cash),总金额为32.30元。
6.混合型元素
在实际应用中,一个元素可能既包含字符数据类型(#PCDATA),又包含子元素,这样的元素可以定义为混合型元素。混合型元素声明的基本语法如下:
<!ELEMENT元素名称(#PCDATA|子元素1|子元素2|子元素3|…)*>
混合元素模型具有局限性,它不能够设定子元素的顺序及出现的次数,破坏了XML文档的层次结构,不建议使用。实际使用时可以将#PCDATA可析字符数据用新元素封装,以代替混合元素模型。【例3-12】
案例说明:混合元素模型的使用。
程序名称:ch3-9.xml
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPEBookList[
03 <!ELEMENTTitle(#PCDATA)>
04 <!ELEMENTAbstract(#PCDATA)>
05 <!ELEMENTAuthor(#PCDATA)>
06 <!ELEMENTPublisher(#PCDATA)>
07 <!ELEMENTPubDate(#PCDATA)>08 <!ELEMENTISBN(#PCDATA)>
09 <!ELEMENTBook(#PCDATA|Title|Abstract|Author
|Publisher|PubDate|ISBN)*>
10 <!ELEMENTBookList(Book)*>
11
]>
12
<BookList>
13 <Book>
14 计算机类图书
15 <Title>软件工程</Title>
16 <Abstract>介绍软件工程理论...</Abstract>17 <Author>邓良松,刘海岩</Author>
18 <Publisher>西安电子科技大学出版社</Publisher>
19 <PubDate>2001年6月</PubDate>
20 <ISBN>7-5606-0924-4</ISBN>
21 </Book>
22 <Book>
23 <Title>软件系统开发技术(修订版)</Title>
24 <ISBN>7-5606-0492-7</ISBN>
25 <Author>潘锦平</Author>26 <Publisher>西安电子科技大学出版社</Publisher>
27 <PubDate>2001年1月</PubDate>
28 </Book>
29 <Book>
30 <Title>基督山伯爵</Title>
31 <Author>大仲马</Author>
32 世界文学名著
33 </Book>
34
</BookList>案例分析:第09行声明了Book元素。Book元素是混合型元素,其内容可以是文本字符数据(#PCDATA)、子元素Title、Abstract、Author、Publisher、PubDate或ISBN之一,可选的混合内容后跟“*”控制符,表示Book元素的内容可以是0个或任意多个。程序ch3-9.xml中第13行至第21行的Book由一个字符数据和6个子元素组成。第22行至第28行的Book由5个子元素组成,不含字符数据。第29行至第33行的Book由2个子元素和字符数据组成。
7.元素分组
在声明复合元素时,可以使用圆括号“()”将逻辑含义相同的部分子元素组合成一个“元素组”,“元素组”和普通元素在特性上相似。在元素组内部,元素要按规定次序出现,而且可以用修饰符“*”、“+”和“?”控制元素出现的次数。“元素组”增加了元素内容设定的灵活性。【例3-13】
案例说明:DTD中使用元素分组声明XML标签。
程序名称:ch3-10.xml
01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPEOrder[
03 <!ELEMENTOrderID(#PCDATA)>
04 <!ELEMENTBookName(#PCDATA)>
05 <!ELEMENTNumber(#PCDATA)>
06 <!ELEMENTUnitPrice(#PCDATA)>
07 <!ELEMENTCash(#PCDATA)>08 <!ELEMENTCredit_Card(#PCDATA)>
09 <!ELEMENTPayment(Cash|Credit_Card)>
10 <!ELEMENTOrder_Date(#PCDATA)>
11 <!ELEMENTOrder(OrderID,(BookName,Number,UnitPrice)+,Payment,Order_Date)>
12
]>
13
<Order>
14 <OrderID>10000001</OrderID>
15 <BookName>软件工程</BookName>
16 <Number>1</Number>17 <UnitPrice>20.00</UnitPrice>
18 <BookName>软件系统开发技术(修订版)</BookName>
19 <Number>1</Number>
20 <UnitPrice>12.30</UnitPrice>
21 <Payment>
22 <Cash>32.30</Cash>
23 </Payment>
24 <Order_Date>2007年5月10日</Order_Date>
25
</Order>案例分析:用户订购图书的订单中,描述图书订购信息的元素是一致的,可以用元素组来声明。第11行将BookName(图书名称)、Number(订购数量)和UnitPrice(单价)组成元素组进行声明,使用“+”控制符,表示该元素组至少出现一次。第15行至第20行使用元素组描述了两种图书的订购信息。
3.4使用DTD声明XML属性
属性是可以在开始和空标签中使用的用来添加附加信息的名值对。属性是对元素的补充和修饰,它能够将一些简单的特性与元素相关联。通过属性,我们可以给元素绑定大量信息。例如,<BookTitle="软件系统开发技术(修订版)"ISBN="7-5606-0492-7"UnitPrice="12.30"/>,其中元素Book的属性Title指出书名“软件系统开发技术(修订版)”,Book的ISBN属性值为“7-5606-0492-7”,Book的UnitPrice属性指出图书的单价为“12.30”。下面具体介绍属性的声明、属性默认值的设定和属性值类型的设定。3.4.1属性声明的基本语法
在XMLDTD中是使用ATTLIST标记声明属性的。对于含属性的元素,至少要通过一个ATTLIST标记声明其属性列表。ATTLIST声明由以下部分构成:ATTLIST关键字、属性修饰的元素名称,以及零个或多个属性定义。为了增强可读性,每个属性定义通常占据单独的一行。属性定义包含属性名称、类型和缺省声明。在DTD中定义属性的基本语法为:
<!ATTLISTElementNameAttributeNameType[Keyword][DefaultValue]>上述语法说明如下:
(1) ATTLIST为定义属性的指令,是关键字,必须大写。
(2) ElementName为DTD中声明的元素名称。
(3) AttributeName为元素ElementName的属性名称。
(4) Type为属性值的类型。DTD中属性值的类型的定义有10种,将在3.4.3节中介绍。
(5) Keyword为设定属性缺省值的关键字,可缺省。属性缺省值设定将在3.4.2节中介绍。
(6) DefaultValue为属性的缺省值,该项可以缺省。定义元素的属性时,可以指定一个缺省值,如果XML文档中没有明确对元素属性赋值,则DTD中定义的该属性的缺省值将被选用。3.4.2设定属性的缺省值
属性的声明可以有几种不同的缺省值,它定义了属性在文档中出现的方式。属性的缺省值可以直接指定,可以要求作者必须提供,也可以忽略属性值,甚至可以指定固定值。下面分别对这几种情况进行讨论。
1.直接指定缺省值
在DTD中使用关键字ATTLIST进行属性声明时,可以给属性一个缺省值,该缺省值用引号包围。在XML中如果重新设定了属性的新值,则新值将代替缺省值。如果没有重新设定该属性的新值,则DTD中定义的缺省值将作为该属性的值。声明语法如下:
<!ATTLIST元素名称属性名称属性类型"缺省值">下面通过一个案例来说明。
【例3-14】
案例说明:直接指定属性缺省值。
程序名称:ch3-11.xml
01 <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
02 <!DOCTYPEBookList[
03 <!ELEMENTTitle(#PCDATA)>
04 <!ELEMENTAuthor(#PCDATA)>
05 <!ELEMENTPublisher(#PCDATA)>
06 <!ELEMENTPubDate(#PCDATA)>07 <!ELEMENTISBN(#PCDATA)>
08 <!ELEMENTBook(Title,Author,Publisher,
PubDate,ISBN)>
09 <!ELEMENTBookList(Book)*>
10 <!ATTLISTBookCategoryCDATA"计算机">
11 ]>
12 <BookList>
13 <BookCategory="计算机">
14 <Title>软件工程</Title>
15 <Author>邓良松,刘海岩</Author>16 <Publisher>西安电子科技大学出版社</Publisher>
17 <PubDate>2001年6月</PubDate>
18 <ISBN>7-5606-0924-4</ISBN>
19 </Book>
20 <Book>
21 <Title>软件系统开发技术(修订版)</Title>
22 <Author>潘锦平</Author>
23 <Publisher>西安电子科技大学出版社</Publisher>
24 <PubDate>2001年1月</PubDate>25 <ISBN>7-5606-0492-7</ISBN>
26 </Book>
27 <BookCategory=“小说”>
28 <Title>基督山伯爵</Title>
29 <Author>大仲马</Author>
30 <Publisher>北京-中国对外翻译出版公司</Publisher>
31 <PubDate>2005年5月</PubDate>
32 <ISBN>7-5001-1365-X</ISBN>
33 </Book>
34
</BookList>案例分析:第10行的DTD声明中为元素Book定义一个属性Category,该属性为字符数据类型,属性的默认值为“计算机”,定义了图书默认类别为计算机类图书。案例中的XML文档描述了三本图书的信息。第13行为第一本图书“软件工程”指定了图书的类别“计算机”。第20行没有指定图书“软件系统开发技术(修订版)”的类别,在实际使用时,XML的解析器将会使用DTD中声明的属性缺省值“计算机”作为该图书的类别。第27行指定了图书“基督山伯爵”的类别为“小说”,实际使用时XML解析器将会用新值“小说”代替属性缺省值“计算机”。
图3-1为程序ch3-11.xml在浏览器中的显示结果。图3-1程序ch3-11.xml在浏览器中的显示结果
2.#REQUIRED
有时无法知道属性的默认值是什么,但在XML文档中又必须要求提供属性值。这时可以使用大写关键字#REQUIRED作为属性的缺省值,要求XML文档的编写者在编写XML文档时,必须给设定了关键字#REQUIRED的属性赋值,并将其包含到指定的元素中。如果语法分析器遇到应包含该属性的元素而没有设定该属性,将返回一个错误。声明语法如下:
<!ATTLIST元素名称属性名称属性类型#REQUIRED>【例3-15】
案例说明:使用关键字#REQUIRED作为属性的缺省值。
案例名称:ch3-12.xml
01 <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
02 <!DOCTYPEBookList[
03 <!ELEMENTTitle(#PCDATA)>
04 <!ELEMENTAuthor(#PCDATA)>
05 <!ELEMENTPublisher(#PCDATA)>
06 <!ELEMENTPubDate(#PCDATA)>
07 <!ELEMENTISBN(#PCDATA)>08 <!ELEMENTBook(Title,Author,Publisher,PubDate,ISBN)>
09 <!ELEMENTBookList(Book)*>
10 <!ATTLISTBook
CategoryCDATA“计算机”
PageCountCDATA#REQUIRED>
11
]>
12
<BookList>
13 <BookCategory="计算机"PageCount="308">
14 <Title>软件工程</Title>
15 <Author>邓良松,刘海岩</Author>16
<Publisher>西安电子科技大学出版社</Publisher>
17
<PubDate>2001年6月</PubDate>
18
<ISBN>7-5606-0924-4</ISBN>
19
</Book>
20
<BookPageCount=“248”>
21
<Title>软件系统开发技术(修订版)</Title>
22
<Author>潘锦平</Author>
23
<Publisher>西安电子科技大学出版社</Publisher>
24
<PubDate>2001年1月</PubDate>
25
<ISBN>7-5606-0492-7</ISBN>26 </Book>
27 <BookCategory=“小说”PageCount=“239”>
28 <Title>基督山伯爵</Title>
29 <Author>大仲马</Author>
30 <Publisher>北京-中国对外翻译出版公司</Publisher>
31 <PubDate>2005年5月</PubDate>
32 <ISBN>7-5001-1365-X</ISBN>
33 </Book>
34
</BookList>案例分析:第10行的DTD为元素Book声明了属性Category(图书类别)、PageCount(图书总页数)。Category指定了默认值“计算机”,PageCount没有直接指定默认值,而是使用关键字#REQUIRED要求在编写XML文档时必须根据实际情况封装图书总页数。程序ch3-12.xml的第13、20、27行分别使用属性PageCount指出三本图书的总页数。
3.#IMPLIED
当不强调为某个属性指定缺省值,而且也不需要强制文档开发人员必须在文档中使用该属性时,可以使用大写的关键字#IMPLIED作为该属性的缺省值。XML的处理器在处理XML文档时,如果XML文档的编写者为缺省值是#IMPLIED的属性设定属性值,处理器则向XML应用程序提供编写者设定的属性值;如果XML文档编写者没有设定属性值,则处理器明确通知XML应用程序该属性没有可用值。#IMPLIED的声明语法如下:
<!ATTLIST元素名称属性名称属性类型#IMPLIED>【例3-16】
案例说明:使用关键字#IMPLIED作为属性的缺省值。
程序名称:ch3-13.xml
01 <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
02 <!DOCTYPEBookList[
03 <!ELEMENTTitle(#PCDATA)>
04 <!ELEMENTAuthor(#PCDATA)>
05 <!ELEMENTPublisher(#PCDATA)>
06 <!ELEMENTPubDate(#PCDATA)>
07 <!ELEMENTISBN(#PCDATA)>08 <!ELEMENTBook(Title,Author,Publisher,PubDate,
ISBN)>
09 <!ELEMENTBookList(Book)*>
10 <!ATTLISTBook
CategoryCDATA“计算机”
PageCountCDATA#IMPLIED>
11
]>
12
<BookList>
13 <BookCategory="计算机">
14 <Title>软件工程</Title>
15 <Author>邓良松,刘海岩</Author>16
<Publisher>西安电子科技大学出版社</Publisher>
17
<PubDate>2001年6月</PubDate>
18
<ISBN>7-5606-0924-4</ISBN>
19 </Book>
20 <Book>
21
<Title>软件系统开发技术(修订版)</Title>
22
<Author>潘锦平</Author>
23
<Publisher>西安电子科技大学出版社</Publisher>
24
<PubDate>2001年1月</PubDate>
25
<ISBN>7-5606-0492-7</ISBN>26 </Book>
27 <BookCategory=“小说”PageCount=“239”>
28 <Title>基督山伯爵</Title>
29 <Author>大仲马</Author>
30 <Publisher>北京-中国对外翻译出版公司</Publisher>
31 <PubDate>2005年5月</PubDate>
32 <ISBN>7-5001-1365-X</ISBN>
33 </Book>
34
</BookList>案例分析:第10行声明了元素Book的属性PageCount。PageCount的缺省值为#IMPLIED,案例中XML第13行和第20行没有为图书指定总页数,第27行指定了图书总页数为239页。XML处理器在处理该XML文档时,对“软件工程”和“软件系统开发技术(修订版)”两本图书将不向应用程序提供PageCount的属性值,而在处理“基督山伯爵”图书时向应用程序提供PageCount的属性值239。
程序ch3-13.xml在浏览器中的显示结果如图3-2所示。图3-2程序ch3-13.xml在浏览器中的显示结果
4.#FIXED
如果需要为一个特定的属性提供默认值,并且不希望XML的编写者将默认值替代掉,可以使用大写关键字#FIXED为属性提供默认值。#FIXED加上属性默认值,属性的值永远固定为默认值。如果元素中不包含该属性,XML解析器将默认值作为该元素指定属性的属性值。包含#FIXED关键字的属性声明语法如下:
<!ATTLIST元素名称属性名称属性类型#FIXED"默认值">【例3-17】
案例说明:使用#FIXED关键字声明属性默认值。
程序名称:ch3-14.xml
01 <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
02 <!DOCTYPEBookList[
03 <!ELEMENTTitle(#PCDATA)>
04 <!ELEMENTAuthor(#PCDATA)>
05 <!ELEMENTPublisher(#PCDATA)>
06 <!ELEMENTPubDate(#PCDATA)>
07 <!ELEMENTISBN(#PCDATA)>08 <!ELEMENTBook(Title,Author,Publisher,
PubDate,ISBN)>
09 <!ELEMENTBookList(Book)*>
10 <!ATTLISTBook
CategoryCDATA#FIXED“计算机”
PageCountCDATA#IMPLIED>
11
]>
12
<BookList>
13 <BookCategory=“计算机”PageCount=“308”>
14
<Title>软件工程</Title>
15
<Author>邓良松,刘海岩</Author>
16
<Publisher>西安电子科技大学出版社</Publisher>17 <PubDate>2001年6月</PubDate>
18 <ISBN>7-5606-0924-4</ISBN>
19 </Book>
20 <BookPageCount=“248”>
21 <Title>软件系统开发技术(修订版)</Title>
22 <Author>潘锦平</Author>
23 <Publisher>西安电子科技大学出版社</Publisher>
24 <PubDate>2001年1月</PubDate>
25 <ISBN>7-5606-0492-7</ISBN>
26 </Book>
27
</BookList>案例分析:第10行使用关键字#FIXED声明元素Book的属性Category,指定Category的默认值为“计算机”,则程序ch3-14.xml文档只能描述图书类别为计算机类的图书。文档中出现其他类的图书则不合法。第13行使用属性Category指定图书类别为“计算机”。第20行没有设置属性Category,XML文档解析
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解除施工合同协议书模板
- 摄影合作协议书合同
- 测试驱动开发(TDD)基本原则试题及答案
- 旧工程拆除合同协议书
- 江苏专版2025版高考生物二轮复习专题八现代生物科技专题主攻点之二胚胎工程生物技术的安全性和伦理问题与生态工程练习含解析
- 合同补偿协议书模板下载
- 嵌入式开发常见问题试题及答案
- 生动有趣的C语言试题及答案
- VFP编程学习难点突破试题及答案
- 终止合同协议书如何写
- 国有企业干部选拔任用条例
- 办理居住证工作证明 (模板)
- 中藏医适宜技术课件
- 通用造价35kV~750kV线路(国网)课件
- 2022年广东省深圳市中考化学真题试卷
- 工贸企业有限空间作业场所安全管理台账
- 国际财务管理教学ppt课件(完整版)
- DB33∕T 715-2018 公路泡沫沥青冷再生路面设计与施工技术规范
- 彩色简约鱼骨图PPT图表模板
- 光引发剂的性能与应用
- PID控制经典PPT
评论
0/150
提交评论