第1章 XML基本结构和DTD-_第1页
第1章 XML基本结构和DTD-_第2页
第1章 XML基本结构和DTD-_第3页
第1章 XML基本结构和DTD-_第4页
第1章 XML基本结构和DTD-_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XML结构2XML文件的整体结构xml文件包括三部分:XML声明、处理指示(可选)、XML元素。XML文档的一个基本要求是形式良好的(wellformed),一个形式良好的XML文档要包含这三个部分。<?xmlversion="1.0"encoding="gb2312"?>

<?xml-stylesheettype="text/xsl"href="mystyle.xsl"?>

<学生花名册>

<学生>

<名字>李华</名字>

<籍贯>河北</籍贯>

<年龄>15</年龄>

<电话号码>62875555</电话号码>

</学生>

<学生>

<名字>张三</名字>

<籍贯>北京</籍贯>

<年龄>14</年龄>

<电话号码>82873425</电话号码>

</学生>

</学生花名册>3XML文件的整体结构用XML声明作为开头XML声明由“<?”开始,“?>”结束。在“<?”后面紧跟着处理指示的名称,在这里是“xml”。声明中必须指定“version”的属性值。声明中还有两个可选属性,分别是“standalone”和“encoding”。standalone属性表明该XML文件是否和一个独立的置标声明文件配套使用。如果这个属性置为“no”,则有可能有这样一个文件。encoding属性所有的XML语法分析器都要支持8位和16位的编码标准。简体中文码:GB2312繁体中文码:BIG5国际字符:UTF-8处理指示处理指示是用来给处理XML文件的应用程序提供信息的。4XML文件的实质内容——元素元素是XML文件内容的基本单元。从语法上讲,一个元素包含一个起始标记、一个结束标记以及标记之间的数据内容。其形式是:

〈标记〉数据内容〈/标记〉另外,元素中还可以再嵌套别的元素。比如数据内容可再扩展为

<标记1>数据内容1</标记1>

<标记2>数据内容2</标记2>

...

<标记n>数据内容1</标记n>元素里还可以再嵌套元素,实现循环嵌套。最外层的元素称为根元素。一个xml文档只能有一个根元素。5字符数据与实体引用一对标记之间出现的字符数据可以是任何合法的UNICODE字符,但不能包含字符“〈”。这是因为,字符“〈”被预留用作标记的开始符。在XML中,起始和结束标记之间出现的所有合法字符都被忠实地传给XML处理程序。

为了避免把字符数据和标记中需要用到的一些特殊符号相混淆,XML还提供了一些有用的

实体引用。这些特殊的XML实体引用包括:大于(>):>小于(<):<连字符(&):&双引号(“)"单引号(’):'<STATEMENTVALUE="Shesaid,"Dontgothere!"">正确的写法应该是:

<STATEMENTVALUE="Shesaid,"Don'tgothere!"">6标记XML的标记和HTML的标记在模样上大体相同,除了注释和CDATA部分以外,所有符号〈和符号〉之间的内容都称为标记。其基本形式为:〈标记名(属性名=“属性取值”)*〉XML对于标记的语法规定比HTML严格大小写有所区分要有正确的结束标记标记要正确嵌套有效使用属性7CDATA可以把XML文件中除标记以外的所有内容都看作是字符数据,而把标记中的所有内容都看作置标。在一个特殊的标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当作字符数据看待。CDATA的形式如下:

〈![CDATA[

文本内容

]]〉8CDATA例如,要在“示例”元素中放入了一段XML代码:<联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人><示例>

<联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人>

</示例><示例>

<![CDATA[

<联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人>

]]〉

〈/示例〉9注释在HTML中,注释是用“〈!--”和“--〉”引起来的。在XML中,注释的方法完全相同<示例>

<!--一个XML的例子-->

<![CDATA[

<联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人>

]]>

</示例><!--一个XML的例子

<!--以上是一个注释-->

-->10形式良好的XML为了使一个文档“形式良好”,XML文档中的所有置标和字符数据必须遵守前几节中给出的规则。而且有几条关于如何把置标和字符数据相互联系起来的规则。这些规则总结如下:1.文档的开始必须是XML声明。2.含有数据的元素必须有起始标记和结束标记。3.不含数据并且仅使用一个标记的元素必须以/>结束。4.文档只能包含一个能够包含全部其他元素的元素。5.元素只能嵌套不能重叠。6.属性值必须加引号。7.字符<和&只能用于起始标记和实体引用。8.出现的实体引用只有&、<、>、'和"。11内部DTD一个XML文件必须遵守文件类型描述DTD(DocumentTypeDefinition)中定义的种种规定。所有的文件都是由序言和文件体构成的。序言中包含了XML声明,在序言中还可以包含DTD定义。最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是

紧接在XML处理指示之后。一个包含DTD的XML文件的结构为:<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

<!DOCTYPE根元素名[

元素描述

]>

文件体.......12外部DTD可以方便高效地被多个XML文件所共享你只要写一个DTD文件,就可以被多个XML文件所引用。为了引用外部DTD,必须修改XML声明和DOCTYPE声明。XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是yes了:

<?xmlversion="1.0"encoding="GB2312"standalone="no"?>

在DOCTYPE声明中,应该加入SYSTEM属性:

<!DOCTYPE根元素名SYSTEM"外部DTD文件的URL"><!DOCTYPE联系人列表

SYSTEM"/dtds/fclml.dtd">上面的URL是一个绝对路径,除此以外,它还可以是一个相对路径,如:

<!DOCTYPE联系人列表

SYSTEM"fclml.dtd">

13共用DTD使用外部DTD时,要在DOCTYPE中使用关键字SYSTEM。实际上,SYSTEM不是引用外部DTD的唯一方法,这个关键字主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。还存在一种外部DTD,它是一个由权威机构制订的,提供给特定行业或公众使用的DTD。因此,另一个引用外部DTD的办法是使用关键字PUBLIC,引用这一类公开给公众使用的DTD。当使用关键字PUBLIC进行引用时,这个外部DTD还需要得到一个标识名。引用公共DTD的形式为:<!DOCTYPE根元素PUBLIC"DTD名称""外部DTD的URL">请见下面例子:

<!DOCTYPE联系人列表PUBLIC"联系人DTD""/dtds/fclml.dtd">14元素类型声明1一个DTD不仅要告诉语法分析器它所关联的XML文件的根元素是什么,而且还要告

诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了定义这些细节,我们必须展开DTD中元素说明部分,使用元素类型声明(ETD)来声明所有有效的文件元素。ETD不但说明了每个文件中可能存在的元素,给出了元素的名字,而且给出了元素的

具体类型。15元素类型声明1ETD应该采用如下的结构:<!ELEMENT元素名元素内容描述>因此,在前面的例子里,可以在文件序言中通过如下方式定义“联系人列表”这个元素:<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

<!DOCTYPE联系人列表[

<!ELEMENT联系人列表ANY>

]><联系人列表>

...

</联系人列表>16元素类型声明2为了使元素“联系人列表”中还可以包含其它元素,我们还需要定义元素“联系人”和“姓名”。<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

<!DOCTYPE联系人列表[

<!ELEMENT联系人列表ANY>

<!ELEMENT联系人(姓名)>

<!ELEMENT姓名(#PCDATA)>

]><联系人列表>

<联系人>

<姓名>张三</姓名>

</联系人>

</联系人列表>17元素类型声明2注意:1.除了根元素外,在定义其它元素时使用关键字ANY都是不好的习惯。2.在定义元素时,ETD的顺序是无关紧要的。3.还有一点要注意,不能对不同的元素使用相同的元素名,即便这些元素的内容、包含的子元素不同也不行,因为它只会引起文件各个元素的混淆,使文件的可读性大打折扣。4.元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以“xml”开头。尽管XML1.0标准允许使用任何长度的文件名,但是实际的XML处理器常常会限制标记名的长度。18定义元素及其子元素元素“联系人”必须包含一个,且只能包含一个子元素“姓名”。可如果子元素是“EMAIL地址”怎么办?联系人可能根本没有自己的EMAIL邮箱,也可能有好几个EMAIL帐号。使用正则表达式,我们就可以解决上述问题,描述父元素与子元素之间非常复杂的

关系。例如,你可以对一个元素作如下任何一种类型的定义:它有一个子元素,有一个或多个子元素,有零个或多个子元素,至少有一个子元素。你还可以定义复合关系,比如“元素X是有效的,如果它含有一个或多个子元素Y,或一个子元素Z”。19定义元素及其子元素元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。ECM中的内容采取一组正则表达式的形式。元字符含义

+ 出现一次或多次

* 出现零次或多次

? 可选,不出现或出现一次

()一组要共同匹配的表达式

| OR,或

,AND, 要求严格遵从顺序要求

元素A

元素B

元素C元素列表,无须遵从顺序要求

20有顺序的子元素在元素内容定义中,使用逗号(,)可以使一个元素的各个子元素之间要遵循一定的顺序。<!ELEMENT联系人(姓名,EMAIL)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人><联系人>

<EMAIL>zhang@</EMAIL>

<姓名>张三</姓名>

</联系人>21重复元素<!ELEMENT联系人(姓名,EMAIL+)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

<EMAIL>zhang@</EMAIL>

<EMAIL>zhang@</EMAIL>

</联系人>“+”表示一个或多个有效<!ELEMENT联系人(姓名,EMAIL*)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)><联系人>

<姓名>张三</姓名>

</联系人>“*”表示零个或多个有效22成组元素元素可以使用括号并为一组。因此,下面的DTD片段说明,一个“联系人”元素中可以有一个或多个“姓名/EMAIL”子元素对,并且在每个子元素对中,“姓名”都放在“EMAIL”之前。<!ELEMENT联系人(姓名,EMAIL)+>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL><姓名>李四</姓名>

<EMAIL>li@</EMAIL><姓名>王五</姓名>

<EMAIL>wang@</EMAIL>

</联系人>23OR或符号“|”描述了一个OR操作。因此,下面的DTD片段所规定的XML元素是:所有的“联系人”元素应该有一个“姓名”子元素,同时,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”两个元素。<!ELEMENT联系人(姓名,(电话|EMAIL))>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENT电话(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)><联系人>

<姓名>张三</姓名>

<电话>12345678</EMAIL>

</联系人><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人>24可选子元素字符“?”说明一个子元素是可选的,它可以出现,也可以不出现。<!ELEMENT联系人(姓名,(电话|EMAIL),地址?)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENT电话(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)>

<!ELEMENT地址(街道,城市,省份)>

<!ELEMENT街道(#PCDATA)>

<!ELEMENT城市(#PCDATA)>

<!ELEMENT省份(#PCDATA)><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

<地址>

<街道>五街1234号</街道>

<城市>北京市</城市>

<省份>北京</省份>

</地址>

</联系人><联系人>

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人>25混合内容&空元素一个元素包含子元素的同时也包含纯文本,这称为混合内容的元素。<?xmlversion="1.0"encoding="GB2312">

<!DOCTYPECONTACTS[

<!ELEMENT联系人列表ANY>

<!ELEMENT联系人(#PCDATA|姓名|电话|EMAIL)*>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENT电话(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)>

]><联系人列表>

<联系人>

<姓名>张三</姓名>

<电话>(010)62345678</电话>

<EMAIL>zhang@</EMAIL>

这是关于张三的信息

</联系人>

</联系人列表><!ELEMENTHREMPTY>

EMPTY关键字用于定义XML文件中的空元素,例如此处的<HR/>。26定义有效的元素属性一个有关“商品”的元素,它有两个属性,即“类型”和“颜色”:<商品类型="服装"颜色="黄色">在DTD中使用下面的格式为元素定义属性:<!ATTLIST元素名(属性名属性类型缺省值)*>注意:由于ATTLIST是一个属性的列表,它可以包含很多属性,在实际应用中,一个元素也经常有多个属性。<!ATTLIST商品

类型CDATA#REQUIRED

颜色CDATA#IMPLIED

>27属性缺省值属性的缺省值又可以分为以下三类:必须赋值的属性,关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。属性值可有可无的属性,当使用IMPLIED关键字时,文法解释器不再强行要求在XML文件中给该属性赋值,而且也无须在DTD中为该属性提供缺省值。固定取值的属性,为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。28属性缺省值定义缺省值的属性如果不使用上面任何一种关键字,该种属性就是属于这种类型,这种属性需要在DTD中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用DTD中给出的缺省值。<!ATTLIST页面作者

姓名CDATA#IMPLIED

年龄CDATA#IMPLIED

联系信息CDATA#REQUIRED

网站职务CDATA#FIXED"页面作者"

个人爱好CDATA"上网">29属性类型一个元素可以为以下十种类型中的任意一种:CDATAEnumeratedIDIDREFIDREFSENTITYENTITIESNMTOKENNMTOKENSNOTATION30CDATA类型CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“"”组成的字符串。

对于上述中的特殊字符,应该使用实体&代替“&”,<代替“<”,"代替“"”。<?xmlversion="1.0"

encoding="GB2312"

standalone="yes"?>

<!DOCTYPE剧本[

<!ELEMENT剧本ANY>

<!ELEMENT对话(#PCDATA)>

<!ATTLIST对话演员CDATA#IMPLIED>

]>

<剧本>

<对话演员="某甲">我可不这么认为!</对话>

<对话演员="某乙">为什么呢?</对话>

</剧本>31枚举类型属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在DTD定义中的。<?xmlversion="1.0"

encoding="GB2312"

standalone="yes"?>

<!DOCTYPE购物篮[

<!ELEMENT购物篮ANY>

<!ELEMENT肉EMPTY>

<!ATTLIST肉类型(鸡肉|牛肉|猪肉|鱼肉)"鸡肉">

]>

<购物篮>

<肉类型="鱼肉"/>

<肉类型="牛肉"/>

<肉/>

</购物篮>32ID和IDREFID是用属性值的方式为文件中的某个元素定义唯一标识的方法,它的作用类似于HTML文件中的内部链接。ID的值必须是一个有效的XML名称,它由字母、数字或下划线开始,名字中不能出

现空白符。<?xmlversion="1.0"encoding="GB2312"

standalone="yes"?>

<!DOCTYPE联系人列表[

<!ELEMENT联系人列表ANY>

<!ELEMENT联系人(姓名,EMAIL)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)>

<!ATTLIST联系人编号ID#REQUIRED>

]><联系人列表>

<联系人编号="1">

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人><联系人编号="2">

<姓名>李四</姓名>

<EMAIL>li@</EMAIL>

</联系人>

</联系人列表>33ID和IDREFIDREF类型允许一个元素的属性使用文件中的另一个元素,方法就是把那个元素的ID标识值作为该属性的取值。<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

<!DOCTYPE联系人列表[

<!ELEMENT联系人列表ANY>

<!ELEMENT联系人(姓名,EMAIL)>

<!ELEMENT姓名(#PCDATA)>

<!ELEMENTEMAIL(#PCDATA)>

<!ATTLIST联系人编号ID#REQUIRED>

<!ATTLIST联系人上司IDREF#IMPLIED>

]><联系人列表>

<联系人编号="2">

<姓名>张三</姓名>

<EMAIL>zhang@</EMAIL>

</联系人><联系人编号="1"上司="2">

<姓名>李四</姓名>

<EMAIL>li@</EMAIL>

</联系人>

</联系人列表>34NMTOKEN和NMTOKENSNMTOKEN和NMTOKENS这两种类型用于指示一个有效的名字。NMTOKEN属性取值要求类似于元素名,但可以以数字作为其开头字符。NMTOKES类型值可以由多个NMTOKEN组成,每个NMTOKEN标识之间用空格隔开。关于元素的定义:<!ELEMENT数据(#PCDATA)>

<!ATTLIST数据

安全性(ON|OFF)"OFF"

授权用户NMTOKENS#IMPLIED

>XML文件:<数据安全性="ON"授权用户="IggieeBSelenaSGuntherB">

blahblahblah

</数据>35NOTATION类型NOTATION类型允许属性值为一个DTD中声明的符号,这个类型对于使用非XML格式的数据非常有用。现实世界中存在着很多无法或不易用XML格式组织的数据,例如图象、声音、影象等等。对于这些数据,XML应用程序常常并不提供直接的应用支持。通过为它们设定NOTATION类型的属性,可以向应用程序指定一个外部的处理程序。例如,当你想要为一个给定的文件类型指定一个演示设备时,可以用NOTATION类型的属性作为触发。36NOTATION类型要使用NOTATION类型作为属性的类型,首先要在DTD中为可选用的记号作出定义。定义的方式有两种,一种是使用MIME类型,形式是:<!NOTATION记号名SYSTEM"MIME类型">再有一种是使用一个URL路径,指定一个处理程序的路径。<!NOTATION记号名SYSTEM"URL路径名">37NOTATION类型在这个例子中,为"电影"元素指定了两种可选设备:一种是movPlayer.exe,用来播映.mov文件,另一种则用来绘制GIF图象。<?xmlversion="1.0"

encoding="GB2312"

standalone="yes"?>

<!DOCTYPE文件[

<!ELEMENT文件ANY>

<!ELEMENT电影EMPTY>

<!

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论