




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章文档类型定义DTD
DTD与XML文档定义元素及其后代定义元素的属性第3章文档类型定义DTDDTD与XML文档11DTD与XML文档(1)为什么需要文档类型定义(DTD)? XML文档的基本要求是必须满足格式良好(WellFormed)的要求。格式良好的XML文档是非常简单的。如何根据需要对XML文档进行限制?如何公布一个XML文档的结构?如何重用XML文档的数据?为了解决这些问题,就得需要DTD来解决。什么是文档类型定义(DTD)? DTD描述了一个标记语言的语法和词汇表,也就是定义了可以在XML文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及XML文档结构的其它详细信息。DTD引入有效的XML文档 一个“有效的(Valid)”XML文档既是“格式良好”的,又必须遵守文档类型描述DTD中定义的种种规定。DTD=DocumentTypeDefinition1DTD与XML文档(1)为什么需要文档类型定义(DTD)21DTD与XML文档(2)内部DTD: 最简单的使用DTD的方法是在XML文档的内部分加入一个DTD描述。加入的位置是紧接在XML处理指示之后。<?xmlversion=“1.0”encoding=“GB2312“standalone=”yes”?><!DOCTYPE根元素名[
元素描述
]><根元素名> XML数据</根元素名> 这样,我们就定义了一个文件,它以DOCTYPE中规定的根元素名作为其根元素的名字。例3-1:内部DTD1DTD与XML文档(2)内部DTD:31DTD与XML文档(3)<?xmlversion="1.0"encoding="GB2312" standalone="no"?><!DOCTYPE联系人列表[<!ELEMENT联系人列表(联系人)*><!ELEMENT联系人(姓名,ID,公司,EMAIL,电话,地址)><!ELEMENT地址(街道,城市,省份)><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENTEMAIL(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENT街道(#PCDATA)><!ELEMENT城市(#PCDATA)><!ELEMENT省份(#PCDATA)>]><联系人列表><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><EMAIL>zhang@</EMAIL><电话>(010)62345678</电话><地址><街道>五街1234号</街道><城市>北京市</城市><省份>北京</省份></地址></联系人><联系人><姓名>李四</姓名><ID>002</ID><公司>B公司</公司><EMAIL>li@</EMAIL><电话>(021)87654321</电话><地址><街道>南京路9876号</街道><城市>上海</城市><省份>上海</省份></地址></联系人></联系人列表>1DTD与XML文档(3)<?xmlversion=41DTD与XML文档(4)外部DTD: 将DTD置于XML文档之外的文件中。主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。<?xmlversion="1.0“encoding="GB2312"standalone="no"?><!DOCTYPE根元素名SYSTEM"外部DTD文件的URL"><根元素名> XML数据</根元素名>例3-2:外部DTD1DTD与XML文档(4)外部DTD:51DTD与XML文档(5)<?xmlversion="1.0"encoding="GB2312"standalone="no"?><!DOCTYPE联系人列表SYSTEM"fclml.dtd"><联系人列表><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><EMAIL>zhang@</EMAIL><电话>(010)62345678</电话><地址><街道>五街1234号</街道><城市>北京市</城市><省份>北京</省份></地址></联系人><联系人><姓名>李四</姓名><ID>002</ID><公司>B公司</公司><EMAIL>li@</EMAIL><电话>(021)87654321</电话><地址><街道>南京路9876号</街道><城市>上海</城市><省份>上海</省份></地址></联系人></联系人列表>fclml.dtd:<?xmlversion="1.0"encoding="GB2312"?><!ELEMENT联系人列表(联系人)*><!ELEMENT联系人(姓名,ID,公司,EMAIL,电话,地址)><!ELEMENT地址(街道,城市,省份)><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENTEMAIL(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENT街道(#PCDATA)><!ELEMENT城市(#PCDATA)><!ELEMENT省份(#PCDATA)>1DTD与XML文档(5)<?xmlversion=61DTD与XML文档(6)公用DTD: 它是一个由权威机构制订的,提供给特定行业或公众使用的外部DTD。引用公共DTD的形式为: <!DOCTYPE根元素PUBLIC“DTD标识名""外部DTD的URL">例:<!DOCTYPEDOCUMENTPUBLIC“-//W3C//DTDHTML4.0//EN” “/TR/REC-html/strict.dtd”> 这个“DTD标识名”的命名规则和XML文件的命名规则稍有不同。ISO的以ISO开头,改进的非ISO以+开头,未改进的非ISO的以-开头。后面由多个双斜线组成://所有者//类型描述//语言//版本。例:“-//W3C//DTDHTML4.0//EN”; “-//IETF//ENTITIESLatin1//EN”;“-//W3C//DTDHTML//EN//4.1” 1DTD与XML文档(6)公用DTD:71DTD与XML文档(7)IEXMLTOOL是微软的IE插件,其功能是在IE中对XML文档进行有效性检查和浏览XSLT输出的代码。从下面的网址下载iexmltls.exe:/downloads/details.aspx?FamilyId=D23C1D2C-1571-4D61-BDA8-ADF9F6849DF9&displaylang=en点击iexmltlx.exe解压到一个文件夹中鼠标右键点击上述文件夹中的.inf的文件进行安装使用iexmltls:用IE打开XML文档在打开的IE窗口上点击鼠标右键弹出下拉菜单选择其中的“ValidateXML”1DTD与XML文档(7)IEXMLTOOL是微软的I82定义元素及其后代(1)元素的声明:元素声明不但说明了每个XML文件中可能存在的元素,给出了元素的名字,而且给出了元素的具体类型。一个XML元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。DTD正是通过元素之间的父子关系,描述了整个文件的结构关系。元素的声明形式为:
<!ELEMENT元素名元素内容描述>元素内容可分为如下的3个类型:简单型:元素内容是可解析的字符数据(ParsedCharacterData,PCDATA),即不含有子元素的文本。复合型:元素的内容含有其它元素,既有子元素。混合型:元素的内容既有文本数据又有子元素。2定义元素及其后代(1)元素的声明:92定义元素及其后代(2)简单型元素的声明:
<!ELEMENT元素名(#PCDATA)>空元素的声明:<!ELEMENT元素名EMPTY> 例如:
<!ELEMENTHREMPTY>不限定元素内容的声明:(不推荐使用)<!ELEMENT元素名ANY>2定义元素及其后代(2)简单型元素的声明:102定义元素及其后代(3)例:<?xmlversion="1.0"encoding="GB2312"standalone=“yes"?><!DOCTYPE联系人[<!ELEMENT联系人ANY><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENTEMAIL(#PCDATA)>]><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><电话>(010)62345678</电话><EMAIL>zhang@</EMAIL></联系人>2定义元素及其后代(3)例:112定义元素及其后代(4)复合型元素的声明,即定义元素及其子元素: DTD尽管要求严格,但也有它的灵活性。使用正则表达式,我们就可以描述父元素与子元素之间非常复杂的关系。下面就是描述子元素的正则式:
元字符含
义+出现一次或多次*出现零次或多次?不出现或出现一次()一组要共同匹配的表达式|OR,或,AND,要求严格遵从顺序要求2定义元素及其后代(4)复合型元素的声明,即定义元素及其子122定义元素及其后代(5)要求顺序的子元素 DTD定义(,:有序) <!ELEMENT联系人(姓名,EMAIL)> <!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 下面的XML片断是有效的: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人> 而下面这个XML片断不是有效的: <联系人>
<EMAIL>zhang@</EMAIL>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(5)要求顺序的子元素132定义元素及其后代(6)重复元素 DTD定义(+:至少出现一次) <!ELEMENT联系人(姓名,EMAIL+)> <!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 下面的XML片断是有效的: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<EMAIL>zhang@</EMAIL>
<EMAIL>zhang@</EMAIL>
</联系人> 而下面这个XML片断不是有效的: <联系人>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(6)重复元素142定义元素及其后代(7) DTD定义(*:出现任意次) <!ELEMENT联系人(姓名,EMAIL*)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>成组元素:一组元素放在括号内 DTD定义(元素组) <!ELEMENT联系人(姓名,EMAIL)+>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 符合这个DTD的XML片断可以是: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<姓名>李四</姓名>
<EMAIL>li@</EMAIL>
<姓名>王五</姓名>
<EMAIL>wang@</EMAIL>
</联系人>2定义元素及其后代(7) DTD定义(*:出现任意次)152定义元素及其后代(8)OR或:符号“|”描述了一个OR操作。 <!ELEMENT联系人(姓名,(电话|EMAIL))>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> “联系人”元素应该有一个“姓名”子元素,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”。 下面都是无效的XML片段 <联系人>
<姓名>张三</姓名>
</联系人> <联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
<EMAIL>zhang@</EMAIL>
</联系人> <联系人>
<EMAIL>zhang@</EMAIL>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(8)OR或:符号“|”描述了一个OR操162定义元素及其后代(9) 符合上述DTD定义的有效的XML片段应该是: <联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
</联系人> 或者是: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人> 注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。 下面这样定义的DTD是不合法的: <!ELEMENT联系人(姓名,电话|EMAIL)>2定义元素及其后代(9) 符合上述DTD定义的有效的XML172定义元素及其后代(10)可选子元素:字符“?”说明一个子元素是可选的,可出现,也可不出现。
<!ELEMENT联系人(姓名,(电话|EMAIL),地址?)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ELEMENT地址(街道,城市,省份)>
<!ELEMENT街道(#PCDATA)>
<!ELEMENT城市(#PCDATA)>
<!ELEMENT省份(#PCDATA)>下面的XML片段是“有效的”:<联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址></联系人><联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>2定义元素及其后代(10)可选子元素:字符“?”说明一个子182定义元素及其后代(11)混合内容: <!ELEMENT元素名(#PCDATA|子元素1|子元素2…)*>
在一个元素中可能包含子元素,也可能包含纯文本。把这种元素称为混合内容的元素。在下面的例子中,“联系人”就是一个混合元素。(不推荐使用) <?xmlversion="1.0"encoding="GB2312" standalone="yes"?> <!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(#PCDATA|姓名|电话|EMAIL)*>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
]> <联系人列表>
<联系人>
<姓名>张三</姓名>
<电话>(010)62345678</电话>
<EMAIL>zhang@</EMAIL>
这是关于张三的信息
</联系人>
</联系人列表>2定义元素及其后代(11)混合内容:193定义元素的属性(1)在DTD中定义属性时,使用下面的格式:<!ATTLIST元素名(属性名属性类型缺省值)*>其中:元素名是属性所属的元素的名字;属性名是属性的命名;属性类型是用来指定该属性是属于十个有效属性类型中的哪种类型。缺省值是在没有特别说明属性时的取值,可定义也可不定义;注意:ATTLIST是一个属性的列表,它可以包含很多属性的定义。例: <!ATTLIST商品
类型CDATA#REQUIRED
颜色CDATA#IMPLIED
><商品类型=“服装” 颜色="黄色">3定义元素的属性(1)在DTD中定义属性时,使用下面的格式203定义元素的属性(2)属性缺省值
在DTD中定义的属性的缺省值可以分为以下四类:必须赋值的属性
关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。属性值可有可无的属性
当使用IMPLIED关键字时,不强行要求在XML文件中给该属性赋值,也无须在DTD中为该属性提供缺省值。固定取值的属性
还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。定义缺省值的属性
如果不使用上面任何一种关键字的话,就需要在DTD中为它提供一个缺省值。在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,默认为采用DTD中给出的缺省值。3定义元素的属性(2)属性缺省值
在DTD中定义的213定义元素的属性(3)下面给出一个具体的例子:<!ATTLIST页面作者
姓名CDATA#IMPLIED
年龄CDATA#IMPLIED
联系信息CDATA#REQUIRED
网站职务CDATA#FIXED"页面作者"
个人爱好CDATA"上网">属性类型 一个元素的属性可以为以下八种类型中的任意一种: 1.CDATA 6.ENTITY 2.Enumerated 7.NMTOKEN 3.ID 8.NMTOKENS 4.IDREF 5.IDREFS 3定义元素的属性(3)下面给出一个具体的例子:223定义元素的属性(4)CDATA类型
CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“””组成的字符串。当然,应该使用实体&代替“&”,<代替“<”,"代替“””。请看下面这个关于剧本的例子: <?xmlversion="1.0"encoding="GB2312"
standalone="yes"?>
<!DOCTYPE剧本[
<!ELEMENT剧本ANY>
<!ELEMENT对话(#PCDATA)>
<!ATTLIST对话演员CDATA#REQUIRED>
]> <剧本>
<对话演员="某甲">我可不这么认为!</对话>
<对话演员="某乙">为什么呢?</对话>
</剧本>3定义元素的属性(4)CDATA类型
CDATA指233定义元素的属性(5)枚举类型ENUMERATED
属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在DTD定义中的。
例:<?xmlversion=“1.0”encoding=“GB2312”
standalone=“yes”?>
<!DOCTYPE购物篮[
<!ELEMENT购物篮ANY>
<!ELEMENT肉EMPTY>
<!ATTLIST肉种类(鸡肉|牛肉|猪肉|鱼肉)“鸡肉”>
]> <购物篮>
<肉种类=“鱼肉”/>
<肉种类="牛肉"/>
<肉/>
</购物篮>注意,在上面这个例子中,给属性“种类”定义的缺省值是“鸡肉”,所以“购物篮”中的第三个元素的“种类”属性取值为“鸡肉”。3定义元素的属性(5)枚举类型ENUMERATED
243定义元素的属性(6)ID类型
ID是用属性值的方式为文件中的某个元素定义唯一标识的方法。ID的值必须是一个有效的XML名称,不要给ID类型的属性事先指定缺省值,更不能使用FIXED型的缺省值。 <?xmlversion="1.0"encoding="GB2312"standalone="yes"?>
<!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名,EMAIL)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ATTLIST联系人编号ID#REQUIRED>
]>
<联系人列表>
<联系人编号=“a1">
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>
<联系人编号=“a2">
<姓名>李四</姓名>
<EMAIL>li@</EMAIL>
</联系人>
</联系人列表>3定义元素的属性(6)ID类型253定义元素的属性(7)IDREF类型
IDREF类型允许一个元素的属性使用文件中的另一个元素的ID标识值作为该属性的取值。例如下面的例子: <?xmlversion="1.0"encoding="GB2312"standalone="yes"?>
<!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名,EMAIL)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ATTLIST联系人编号ID#REQUIRED>
<!ATTLIST联系人上司IDREF#IMPLIED>
]>
<联系人列表>
<联系人编号=“a2">
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>
<联系人编号=“a1"上司=“a2">
<姓名>李四</姓名>
<EMAIL>li@</EMAIL>
</联系人>
</联系人列表>3定义元素的属性(7)IDREF类型263定义元素的属性(8)NMTOKEN和NMTOKENS:名称记号 类型NMTOKEN和NMTOKENS是诸多属性类型中面向处理程序的又一个类型。这两个类型用于指示一个有效的XML名称。例如可以通过NMTOKEN类型的属性来访问一个JAVA类等等。 关于元素的定义: <!ELEMENT数据(#PCDATA)>
<!ATTLIST数据
安全性(ON|OFF)"OFF">
授权用户NMTOKENS#IMPLIED
> XML片段: <数据安全性="ON"授权用户="IggieeBSelenaSGuntherB">
blahblahblah
</数据>
3定义元素的属性(8)NMTOKEN和NMTOKENS274实体(1)实体(ENTITY):是XML中用来指代其它复杂结构的机制。一个简单的实体可以代表一大段文本内容。实体可分为内部实体和外部实体。实体声明:内部实体:<!ENTITY实体名“文本内容”>外部实体:<!ENTITY实体名SYSTEM“URI”>实体引用:&实体名;其实像”>;”、”<;”等特殊实体就是一种内部预定义的实体.
4实体(1)实体(ENTITY):是XML中用来指代其它复284实体(2):内部实体<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPE联系人列表[<!ELEMENT联系人列表(联系人*)><!ELEMENT联系人(姓名,公司,地址)><!ELEMENT姓名(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENT地址(#PCDATA)><!ENTITYA公司地址"北京市五街1234号"><!ENTITYB公司地址"上海南京路9876号">]>
<联系人列表> <联系人> <姓名>张三</姓名> <公司>A公司</公司> <地址>&A公司地址;</地址> </联系人> <联系人> <姓名>李四</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> </联系人> <联系人> <姓名>王五</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> </联系人></联系人列表>4实体(2):内部实体<?xmlversion="1.0294实体(3):外部实体<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPE联系人列表SYSTEM"FCLML.DTD"><联系人列表> <联系人> <姓名>张三</姓名> <公司>A公司</公司> <地址>&A公司地址;</地址> </联系人> <联系人> <姓名>李四</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> </联系人> <联系人> <姓名>王五</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> </联系人></联系人列表>
Fclml.dtd:<?xmlversion="1.0"encoding="GB2312"?><!ELEMENT联系人列表(联系人*)><!ELEMENT联系人(姓名,公司,地址)><!ELEMENT地址(#PCDATA)><!ELEMENT姓名(#PCDATA)><!ELEMENT公司(#PCDATA)><!ENTITYA公司地址SYSTEM"北京市五街1234号"><!ENTITYB公司地址SYSTEM"上海南京路9876号">查看实例4实体(3):外部实体<?xmlversion="1.0305DTD中声明的类型小结DTD格式:<!DOCTYPE根元素名[
元素描述
]>元素声明: <!ELEMENT元素名元素内容>属性声明: <!ATTLIST元素名属性名类型缺省值>属性类型:1.CDATA 6.ENTITY 2.Enumerated 7.NMTOKEN 3.ID 8.NMTOKENS 4.IDREF 5.IDREFS 5DTD中声明的类型小结DTD格式:31第3章文档类型定义DTD
DTD与XML文档定义元素及其后代定义元素的属性第3章文档类型定义DTDDTD与XML文档321DTD与XML文档(1)为什么需要文档类型定义(DTD)? XML文档的基本要求是必须满足格式良好(WellFormed)的要求。格式良好的XML文档是非常简单的。如何根据需要对XML文档进行限制?如何公布一个XML文档的结构?如何重用XML文档的数据?为了解决这些问题,就得需要DTD来解决。什么是文档类型定义(DTD)? DTD描述了一个标记语言的语法和词汇表,也就是定义了可以在XML文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及XML文档结构的其它详细信息。DTD引入有效的XML文档 一个“有效的(Valid)”XML文档既是“格式良好”的,又必须遵守文档类型描述DTD中定义的种种规定。DTD=DocumentTypeDefinition1DTD与XML文档(1)为什么需要文档类型定义(DTD)331DTD与XML文档(2)内部DTD: 最简单的使用DTD的方法是在XML文档的内部分加入一个DTD描述。加入的位置是紧接在XML处理指示之后。<?xmlversion=“1.0”encoding=“GB2312“standalone=”yes”?><!DOCTYPE根元素名[
元素描述
]><根元素名> XML数据</根元素名> 这样,我们就定义了一个文件,它以DOCTYPE中规定的根元素名作为其根元素的名字。例3-1:内部DTD1DTD与XML文档(2)内部DTD:341DTD与XML文档(3)<?xmlversion="1.0"encoding="GB2312" standalone="no"?><!DOCTYPE联系人列表[<!ELEMENT联系人列表(联系人)*><!ELEMENT联系人(姓名,ID,公司,EMAIL,电话,地址)><!ELEMENT地址(街道,城市,省份)><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENTEMAIL(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENT街道(#PCDATA)><!ELEMENT城市(#PCDATA)><!ELEMENT省份(#PCDATA)>]><联系人列表><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><EMAIL>zhang@</EMAIL><电话>(010)62345678</电话><地址><街道>五街1234号</街道><城市>北京市</城市><省份>北京</省份></地址></联系人><联系人><姓名>李四</姓名><ID>002</ID><公司>B公司</公司><EMAIL>li@</EMAIL><电话>(021)87654321</电话><地址><街道>南京路9876号</街道><城市>上海</城市><省份>上海</省份></地址></联系人></联系人列表>1DTD与XML文档(3)<?xmlversion=351DTD与XML文档(4)外部DTD: 将DTD置于XML文档之外的文件中。主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。<?xmlversion="1.0“encoding="GB2312"standalone="no"?><!DOCTYPE根元素名SYSTEM"外部DTD文件的URL"><根元素名> XML数据</根元素名>例3-2:外部DTD1DTD与XML文档(4)外部DTD:361DTD与XML文档(5)<?xmlversion="1.0"encoding="GB2312"standalone="no"?><!DOCTYPE联系人列表SYSTEM"fclml.dtd"><联系人列表><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><EMAIL>zhang@</EMAIL><电话>(010)62345678</电话><地址><街道>五街1234号</街道><城市>北京市</城市><省份>北京</省份></地址></联系人><联系人><姓名>李四</姓名><ID>002</ID><公司>B公司</公司><EMAIL>li@</EMAIL><电话>(021)87654321</电话><地址><街道>南京路9876号</街道><城市>上海</城市><省份>上海</省份></地址></联系人></联系人列表>fclml.dtd:<?xmlversion="1.0"encoding="GB2312"?><!ELEMENT联系人列表(联系人)*><!ELEMENT联系人(姓名,ID,公司,EMAIL,电话,地址)><!ELEMENT地址(街道,城市,省份)><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENTEMAIL(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENT街道(#PCDATA)><!ELEMENT城市(#PCDATA)><!ELEMENT省份(#PCDATA)>1DTD与XML文档(5)<?xmlversion=371DTD与XML文档(6)公用DTD: 它是一个由权威机构制订的,提供给特定行业或公众使用的外部DTD。引用公共DTD的形式为: <!DOCTYPE根元素PUBLIC“DTD标识名""外部DTD的URL">例:<!DOCTYPEDOCUMENTPUBLIC“-//W3C//DTDHTML4.0//EN” “/TR/REC-html/strict.dtd”> 这个“DTD标识名”的命名规则和XML文件的命名规则稍有不同。ISO的以ISO开头,改进的非ISO以+开头,未改进的非ISO的以-开头。后面由多个双斜线组成://所有者//类型描述//语言//版本。例:“-//W3C//DTDHTML4.0//EN”; “-//IETF//ENTITIESLatin1//EN”;“-//W3C//DTDHTML//EN//4.1” 1DTD与XML文档(6)公用DTD:381DTD与XML文档(7)IEXMLTOOL是微软的IE插件,其功能是在IE中对XML文档进行有效性检查和浏览XSLT输出的代码。从下面的网址下载iexmltls.exe:/downloads/details.aspx?FamilyId=D23C1D2C-1571-4D61-BDA8-ADF9F6849DF9&displaylang=en点击iexmltlx.exe解压到一个文件夹中鼠标右键点击上述文件夹中的.inf的文件进行安装使用iexmltls:用IE打开XML文档在打开的IE窗口上点击鼠标右键弹出下拉菜单选择其中的“ValidateXML”1DTD与XML文档(7)IEXMLTOOL是微软的I392定义元素及其后代(1)元素的声明:元素声明不但说明了每个XML文件中可能存在的元素,给出了元素的名字,而且给出了元素的具体类型。一个XML元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。DTD正是通过元素之间的父子关系,描述了整个文件的结构关系。元素的声明形式为:
<!ELEMENT元素名元素内容描述>元素内容可分为如下的3个类型:简单型:元素内容是可解析的字符数据(ParsedCharacterData,PCDATA),即不含有子元素的文本。复合型:元素的内容含有其它元素,既有子元素。混合型:元素的内容既有文本数据又有子元素。2定义元素及其后代(1)元素的声明:402定义元素及其后代(2)简单型元素的声明:
<!ELEMENT元素名(#PCDATA)>空元素的声明:<!ELEMENT元素名EMPTY> 例如:
<!ELEMENTHREMPTY>不限定元素内容的声明:(不推荐使用)<!ELEMENT元素名ANY>2定义元素及其后代(2)简单型元素的声明:412定义元素及其后代(3)例:<?xmlversion="1.0"encoding="GB2312"standalone=“yes"?><!DOCTYPE联系人[<!ELEMENT联系人ANY><!ELEMENT姓名(#PCDATA)><!ELEMENTID(#PCDATA)><!ELEMENT公司(#PCDATA)><!ELEMENT电话(#PCDATA)><!ELEMENTEMAIL(#PCDATA)>]><联系人><姓名>张三</姓名><ID>001</ID><公司>A公司</公司><电话>(010)62345678</电话><EMAIL>zhang@</EMAIL></联系人>2定义元素及其后代(3)例:422定义元素及其后代(4)复合型元素的声明,即定义元素及其子元素: DTD尽管要求严格,但也有它的灵活性。使用正则表达式,我们就可以描述父元素与子元素之间非常复杂的关系。下面就是描述子元素的正则式:
元字符含
义+出现一次或多次*出现零次或多次?不出现或出现一次()一组要共同匹配的表达式|OR,或,AND,要求严格遵从顺序要求2定义元素及其后代(4)复合型元素的声明,即定义元素及其子432定义元素及其后代(5)要求顺序的子元素 DTD定义(,:有序) <!ELEMENT联系人(姓名,EMAIL)> <!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 下面的XML片断是有效的: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人> 而下面这个XML片断不是有效的: <联系人>
<EMAIL>zhang@</EMAIL>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(5)要求顺序的子元素442定义元素及其后代(6)重复元素 DTD定义(+:至少出现一次) <!ELEMENT联系人(姓名,EMAIL+)> <!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 下面的XML片断是有效的: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<EMAIL>zhang@</EMAIL>
<EMAIL>zhang@</EMAIL>
</联系人> 而下面这个XML片断不是有效的: <联系人>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(6)重复元素452定义元素及其后代(7) DTD定义(*:出现任意次) <!ELEMENT联系人(姓名,EMAIL*)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>成组元素:一组元素放在括号内 DTD定义(元素组) <!ELEMENT联系人(姓名,EMAIL)+>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> 符合这个DTD的XML片断可以是: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<姓名>李四</姓名>
<EMAIL>li@</EMAIL>
<姓名>王五</姓名>
<EMAIL>wang@</EMAIL>
</联系人>2定义元素及其后代(7) DTD定义(*:出现任意次)462定义元素及其后代(8)OR或:符号“|”描述了一个OR操作。 <!ELEMENT联系人(姓名,(电话|EMAIL))>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)> “联系人”元素应该有一个“姓名”子元素,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”。 下面都是无效的XML片段 <联系人>
<姓名>张三</姓名>
</联系人> <联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
<EMAIL>zhang@</EMAIL>
</联系人> <联系人>
<EMAIL>zhang@</EMAIL>
<姓名>张三</姓名>
</联系人>2定义元素及其后代(8)OR或:符号“|”描述了一个OR操472定义元素及其后代(9) 符合上述DTD定义的有效的XML片段应该是: <联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
</联系人> 或者是: <联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人> 注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。 下面这样定义的DTD是不合法的: <!ELEMENT联系人(姓名,电话|EMAIL)>2定义元素及其后代(9) 符合上述DTD定义的有效的XML482定义元素及其后代(10)可选子元素:字符“?”说明一个子元素是可选的,可出现,也可不出现。
<!ELEMENT联系人(姓名,(电话|EMAIL),地址?)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ELEMENT地址(街道,城市,省份)>
<!ELEMENT街道(#PCDATA)>
<!ELEMENT城市(#PCDATA)>
<!ELEMENT省份(#PCDATA)>下面的XML片段是“有效的”:<联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址></联系人><联系人>
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>2定义元素及其后代(10)可选子元素:字符“?”说明一个子492定义元素及其后代(11)混合内容: <!ELEMENT元素名(#PCDATA|子元素1|子元素2…)*>
在一个元素中可能包含子元素,也可能包含纯文本。把这种元素称为混合内容的元素。在下面的例子中,“联系人”就是一个混合元素。(不推荐使用) <?xmlversion="1.0"encoding="GB2312" standalone="yes"?> <!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(#PCDATA|姓名|电话|EMAIL)*>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENT电话(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
]> <联系人列表>
<联系人>
<姓名>张三</姓名>
<电话>(010)62345678</电话>
<EMAIL>zhang@</EMAIL>
这是关于张三的信息
</联系人>
</联系人列表>2定义元素及其后代(11)混合内容:503定义元素的属性(1)在DTD中定义属性时,使用下面的格式:<!ATTLIST元素名(属性名属性类型缺省值)*>其中:元素名是属性所属的元素的名字;属性名是属性的命名;属性类型是用来指定该属性是属于十个有效属性类型中的哪种类型。缺省值是在没有特别说明属性时的取值,可定义也可不定义;注意:ATTLIST是一个属性的列表,它可以包含很多属性的定义。例: <!ATTLIST商品
类型CDATA#REQUIRED
颜色CDATA#IMPLIED
><商品类型=“服装” 颜色="黄色">3定义元素的属性(1)在DTD中定义属性时,使用下面的格式513定义元素的属性(2)属性缺省值
在DTD中定义的属性的缺省值可以分为以下四类:必须赋值的属性
关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。属性值可有可无的属性
当使用IMPLIED关键字时,不强行要求在XML文件中给该属性赋值,也无须在DTD中为该属性提供缺省值。固定取值的属性
还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。定义缺省值的属性
如果不使用上面任何一种关键字的话,就需要在DTD中为它提供一个缺省值。在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,默认为采用DTD中给出的缺省值。3定义元素的属性(2)属性缺省值
在DTD中定义的523定义元素的属性(3)下面给出一个具体的例子:<!ATTLIST页面作者
姓名CDATA#IMPLIED
年龄CDATA#IMPLIED
联系信息CDATA#REQUIRED
网站职务CDATA#FIXED"页面作者"
个人爱好CDATA"上网">属性类型 一个元素的属性可以为以下八种类型中的任意一种: 1.CDATA 6.ENTITY 2.Enumerated 7.NMTOKEN 3.ID 8.NMTOKENS 4.IDREF 5.IDREFS 3定义元素的属性(3)下面给出一个具体的例子:533定义元素的属性(4)CDATA类型
CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“””组成的字符串。当然,应该使用实体&代替“&”,<代替“<”,"代替“””。请看下面这个关于剧本的例子: <?xmlversion="1.0"encoding="GB2312"
standalone="yes"?>
<!DOCTYPE剧本[
<!ELEMENT剧本ANY>
<!ELEMENT对话(#PCDATA)>
<!ATTLIST对话演员CDATA#REQUIRED>
]> <剧本>
<对话演员="某甲">我可不这么认为!</对话>
<对话演员="某乙">为什么呢?</对话>
</剧本>3定义元素的属性(4)CDATA类型
CDATA指543定义元素的属性(5)枚举类型ENUMERATED
属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在DTD定义中的。
例:<?xmlversion=“1.0”encoding=“GB2312”
standalone=“yes”?>
<!DOCTYPE购物篮[
<!ELEMENT购物篮ANY>
<!ELEMENT肉EMPTY>
<!ATTLIST肉种类(鸡肉|牛肉|猪肉|鱼肉)“鸡肉”>
]> <购物篮>
<肉种类=“鱼肉”/>
<肉种类="牛肉"/>
<肉/>
</购物篮>注意,在上面这个例子中,给属性“种类”定义的缺省值是“鸡肉”,所以“购物篮”中的第三个元素的“种类”属性取值为“鸡肉”。3定义元素的属性(5)枚举类型ENUMERATED
553定义元素的属性(6)ID类型
ID是用属性值的方式为文件中的某个元素定义唯一标识的方法。ID的值必须是一个有效的XML名称,不要给ID类型的属性事先指定缺省值,更不能使用FIXED型的缺省值。 <?xmlversion="1.0"encoding="GB2312"standalone="yes"?>
<!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名,EMAIL)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ATTLIST联系人编号ID#REQUIRED>
]>
<联系人列表>
<联系人编号=“a1">
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>
<联系人编号=“a2">
<姓名>李四</姓名>
<EMAIL>li@</EMAI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025新工人入场安全培训考试试题及答案参考
- 25年公司厂级安全培训考试试题附答案(轻巧夺冠)
- 麻辣学霸测试题及答案
- 2025项目部治理人员安全培训考试试题【基础题】
- 25年公司主要负责人安全培训考试试题汇编
- 2024-2025工厂职工安全培训考试试题附完整答案(全优)
- 2025年日常安全培训考试试题含答案(基础题)
- 2025年新员工入职安全培训考试试题及答案原创题
- 社会对美容师职业的期望及试题及答案
- 2024年小学语文思维训练试题及答案
- 2023年肉牛标准化规模养殖生产技术规范
- 2024年有关业主大会议事规则(示范文本)
- 《中国心力衰竭诊断和治疗指南2024》解读
- 顶管施工危险源辨识及风险评价表
- 燃气热水锅炉调试方案
- 石英砂采购合同(2024版)
- 2021利达JB-QG-LD988EL JB-QT-LD988EL 火灾报警控制器 消防联动控制器调试手册
- 常微分方程教案
- 厨房安全检查表
- 四川省2022年10月自考01759《药物化学(二)》试题
- 供水企业安全生产培训课件
评论
0/150
提交评论