




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章XML数据的底层结构—DTD和XMLSchema2.1XML类型定义语言DTD2.2XML模式Schema
第2章XML数据的底层结构—DTD和XMLSchema1两个基本的概念:1格式良好的XML文档
符合语法的XML文档称为结构良好的XML文档2有效XML文档有效XML文档:内容结构严格遵守它自身的标记说明,能通过自身的语法检查;通过DTD验证的XML文档称为有效的XML文档。格式良好的XML文档与有效的XML文档的区别?有效地XML文档肯定是格式良好的XML文档。反过来,一个格式良好的XML文档不一定是有效的XML文档。有效的XML文档遵守DTD或Schema定义的规则。两个基本的概念:2格式良好XML:<?xmlversion="1.0"encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don'tforgetthemeeting!</body></note>格式良好XML:<?xmlversion="1.0"en3有效(验证)的XML:有效(验证)的XML:4DTD文件:DTD文件:5XMLSchema
XMLSchema
6为什么要用DTD有了DTD,每个XML文件可以携带一个自身格式的描述。有了DTD,不同组织的人可以使用一个通用DTD用来交换数据。应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效可以使用DTD校验自己的XML数据为什么要用DTD有了DTD,每个XML文件可以携带一个自身格7DTD文档类型定义
在xml中,1描述了如何创建DTD,2如何将它与根据它的规则所编写的XML文档相关联,3并且XML处理器如何对DTD进行处理,4有了DTD就可以XML文档的结构是否正确。DTD为XML文档的编写者和处理者提供了共同遵循的标准,使得XML文档有了统一的标准。DTD文档类型定义
在xml中,1描述了如何创建DTD,282.1XML类型定义语言DTD
(DocumentTypeDefinition)
文档类型定义DTD是一套关于标记符的语法规则,它定义了可用在文档中的元素、属性和实体,以及这些内容之间的相互关系。2.1XML类型定义语言DTD
(Docu9建立XML文档的步骤对相关信息项进行命名,将其映射为相应的元素或属性。确定XML文档的层次结构,即各元素之间的嵌套关系。根据DTD编写相应的XML文档。建立XML文档的步骤对相关信息项进行命名,将其映射为相应的元10元素的定义<?xmlversion="1.0"?><!DOCTYPE员工[<!ELEMENT员工(姓名,性别,出生日期)><!ELEMENT姓名(#PCDATA)><!ELEMENT性别(#PCDATA)><!ELEMENT出生日期(#PCDATA)>]><员工><姓名>李亮</姓名><性别>男</性别><出生日期>1978.2.5</出生日期></员工>例题:元素的定义<?xmlversion="1.0"?>例题11
元素定义
1.元素声明
DTD中所用的第一种声明是元素声明。其形式如下:
<!ELEMENT元素名称元素内容说明>
例:<!ELEMENTnamecontent>
其中,name是一个标准的XML标记的名字。content由以下三种之一组成:元素定义
1.元素声明12关键字EMPTY关键字ANY描述包含在本元素中的子元素的顺序和重复次数的内容模型DTD中声明元素应注意:声明以关键字ELEMENT开头,后面是元素名和包含于元素中的子元素列表。数据类型不是DTD的一个特征。DTD中所定义的每个元素,在对应的XML文档中有且仅有一个。XML区分大小写。关键字EMPTY13元素的声明元素内容说明含义#PCDATA表示元素内部只能是可解析的文本数据EMPTY表示元素为空元素,但是元素中可以包含属性ANY表示元素的内容为任意的内容,可以是空元素、可解析文本数据、子元素、混合型元素中的任意一种子元素表示元素的内容只能是指定顺序和出现次数的子元素混合型内容表示元素的内部可以是可解析的文本数据,也可以是子元素,甚至是两者的结合元素的声明元素内容说明含义#PCDATA表示元素内部只能是可142.元素内容类型(Elementcontentmodel)
元素内容通常有五种情况:EMPTY、ANY、#PCDATA、子元素型和混合型。●EMPTY类型
EMPTY用于定义空元素,即该元素只可能有属性而不会有字符数据或子元素声明空元素的语法是:<!ELEMENTemptyelementEMPTY>例:<!ELEMENT元素名
EMPTY>2.元素内容类型(Elementcontentmode15空模式元素不能包含任何子元素,也不能包含任何数据内容。语法:<!ELEMENT元素名EMPTY>例DTD定义如下:<!ELEMENTpersonEMPTY>对应的XML实例1:<family> <person>花花</person></family>对应的XML实例2:<family><personname=“花花”sex=“M”age=“12”/></family>空模式元素不能包含任何子元素,也不能包含任何数据内容。16●ANY类型这种类型的元素声明是:
<!ELEMENTanyelementANY>
这表明该元素可以包含DTD中定义的其它任何元素或已编译的字符数据。●#PCDATA类型不包含其他子元素而只包含字符数据的元素(如<form>),用关键字#PCDATA进行定义,它代表“已编译的字符数据”(parsedcharacterdata)。
PCDATA可以包含除标记以外的一切字符,包括数字、字母和符号等。被定义为包含PCDATA的元素不能包含任何其他的子元素。●ANY类型17<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPETeam[ <!ELEMENTTeam(Teamname,Country,Member+)> <!ELEMENTTeamname(#PCDATA)> <!ELEMENTCountry(#PCDATA)> <!ELEMENTMember(#PCDATA)>]><Team> <Teamname>ACMilan</Teamname> <Country>Italy</Country> <Member>Pipo</Member></Team><?xmlversion="1.0"encoding="18●子元素类型元素可以包含一系列的子元素,子元素内容模型用于指定某个元素可以包含哪些子元素.
根据子元素间的关系,子元素内容模型可以有两种可能的结构:序列和选择。序列:其所有子元素必须出现且只能出现一次,并且按顺序出现。
<!ELEMENTmessage(header,body,footer)>
注意:序列中不能出现#PCDATA
子元素还可以包含其他子元素。●子元素类型192.选择。
<!ELEMENTelem(x∣y∣z)>选择不能同时包含两个以上的子元素。<!ELEMENT性别(男|女)><!ELEMENTGREETINGS((SEASON|NAME),POSTFIX)><!ELEMENT出行(时间,公交|步行)>2.选择。20●混合类型若某元素既包含子元素又包含已编译的字符数据,则该元素具有混合内容。其声明的语法如下:
<!ELEMENTpick(#PCDATA|one|two|three)*>
注意:必须以#PCDATA开头,*必须放在括号之后,混合类型中不能出现,?,+等符号。●混合类型213.元素出现次数指示符(Elementoccurrenceindicator)?字符它说明元素可以出现0次或1次。*字符它说明元素可以不出现,或出现1次或多次。+字符它说明元素必须出现至少一次,或者说可以出现一到多次3.元素出现次数指示符(Elementoccurr22例:
<!ELEMENT简历(姓名,性别,年龄,(电话∣手机),家庭住址?,兴趣爱好*,教育经历+,工作经验*)>例:
<!ELEMENT简历(姓名,性别,年龄,(电话∣手23正确的示例:<!ELEMENTMYFILE(TITLE,AUTHOR,EMAIL)><!ELEMENTMYFILE(TITLE|AUTHOR|EMAIL)><!ELEMENTMYFILE(TITLE,AUTHOR?,EMAIL?)><!ELEMENTMYFILE(TITLE+,AUTHOR?,EMAIL)><!ELEMENTMYFILE(#PCDATA|TITLE)*>错误的示例:<!ELEMENTMIX(#PCDATA|SUBEMENT1|SUBEMENT2)+><!ELEMENTMIX(#PCDATA|SUBEMENT1|SUBEMENT2)?><!ELEMENTMIX(SUBEMENT1|SUBEMENT2|#PCDATA)*><!ELEMENTMIX(SUBEMENT1,#PCDATA)*><!ELEMENTmyMessage((#PCDATA|message)*,message)>
正确的示例:24<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPErosterSYSTEM"3.7.dtd"><roster><student><name>李华</name><sex>男</sex><skill>XML</skill><skill>Java</skill><remark><date>2006</date>该生学习较刻苦,但成绩一般
<date>2007</date>该生学习改进了学习方法,成绩有较大进步
</remark></student></roster><?xmlversion="1.0"encoding="25DTD<?xmlversion="1.0"encoding="UTF-8"?><!ELEMENTrosterANY><!ELEMENTstudent((name,sex?,score*,skill+,remark?))><!ELEMENTname(#PCDATA)><!ELEMENTsex(#PCDATA)><!ELEMENTscore(#PCDATA)><!ELEMENTskill(#PCDATA)><!ELEMENTremark(#PCDATA|date)*><!ELEMENTdate(#PCDATA)>DTD26属性定义属性用于将名字--值,对与元素进行关联。属性说明只能在开始标签和空元素标签中出现。属性声明中详细说明了与给定元素相关联的每个属性名,数据类型和缺省值。属性定义属性用于将名字--值,对与元素进行关联。27属性定义1.属性声明属性声明的语法如下:
<!ATTLISTElement_nameAttribute_nameTypeDefault_value>
其中,ATTLIST关键字用来定义元素所具有的属性,Element_name是元素名,Attribute_name是该元素所具有的属性名,Type是属性的类型,(十种类型)最常用的类型是CDATA,Default_value是属性的默认值。<!ATTLIST对应的元素名属性名属性的类型属性默认值>属性定义28★声明属性时应注意以下几点:属性名称遵循的规则与有效的元素名称相同。在一个给定的元素中不能有两个属性同名。若属性值中含有双引号,则该属性值应用单引号括起来。
★声明属性时应注意以下几点:29设置属性的类型元素内容说明含义CDATA可解析的文本数据Enumerated枚举型数据ENTITY在DTD中声明的实体ENTITYES在DTD中声明的若干实体ID文档中唯一的取值IDREF文档中某个元素ID属性值IDREFS文档中若干个元素的ID属性值NMTOKEN任意不含空格的XML名称NMTOKENS多个XML名称NOTATION在DTD中声明的记号名设置属性的类型元素内容说明含义CDATA可解析的文本数据30类型描述CDATA值为字符数据(characterdata)(en1|en2|..)此值是枚举列表中的一个值ID值为唯一的idIDREF值为另外一个元素的idIDREFS值为其他id的列表NMTOKEN值为合法的XML名称NMTOKENS值为合法的XML名称的列表ENTITY值是一个实体ENTITIES值是一个实体列表NOTATION此值是符号的名称xml:值是一个预定义的XML值类型描述CDATA值为字符数据(characterdat312.属性的类型
CDATA属性类型:字符数据
<!ATTLISTpersonnameCDATA#REQUIRED><?xmlversion="1.0"encoding="GB2312"?>
<!DOCTYPE剧本[
<!ELEMENT剧本ANY>
<!ELEMENT对话(#PCDATA)>
<!ATTLIST对话演员CDATA>
]><剧本>
<对话演员="某甲">我可不这么认为!</对话>
<对话演员="某乙">为什么呢?</对话></剧本>2.属性的类型
CDATA属性类型:字符数据32枚举属性类型:可从列表中选择属性类型属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。各选择值通过竖线“|”分隔;关键字ENUMERATED是不出现在DTD定义中的。<!ATTLISTpersonsex(male∣female)#REQUIRED>枚举属性类型:可从列表中选择属性类型33<?xmlversion=“1.0”encoding=“GB2312”?>
<!DOCTYPE购物篮[
<!ELEMENT购物篮ANY>
<!ELEMENT肉EMPTY>
<!ATTLIST肉类型(鸡肉|牛肉|猪肉|鱼肉)"鸡肉">
]><购物篮>
<肉类型="鱼肉"/>
<肉类型="牛肉"/>
<肉/></购物篮>属性的默认取值为“鸡肉”。不需要引号<?xmlversion=“1.0”encodin34ID属性类型:属性值能唯一标识,一个元素只能有一个ID属性。<!ATTLISTpersonnoID#REQUIRED>ID属性类型:属性值能唯一标识,一个元素只能有一个ID属性。35<?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>
</联系人>
</联系人列表>不是有效的XML名称<?xmlversion=“1.0”
enc36IDREF/IDREFS类型:用来引用同一个文档中另一个元素的ID属性,并且这个属性已经存在。利用这种属性我们可以把两个对象建立一种关联。IDREFS是若干个ID属性的值,之间用空格分开。IDREF/IDREFS类型:用来引用同一个文档中另一个元素37<?xmlversion="1.0"
encoding="GB2312"?>
<!DOCTYPE联系人列表[
<!ELEMENT联系人列表ANY>
<!ELEMENT联系人(姓名,EMAIL)>
<!ELEMENT姓名(#PCDATA)>
<!ELEMENTEMAIL(#PCDATA)>
<!ATTLIST联系人编号ID#REQUIRED>
<!ATTLIST联系人上司IDREF#IMPLIED>
]>
<联系人列表>
<联系人编号="a2">
<姓名>张三</姓名>
<EMAIL>zhang@</EMAIL>
</联系人>
<联系人编号="a1"上司="a2">
<姓名>李四</姓名>
<EMAIL>li@</EMAIL>
</联系人>
</联系人列表><?xmlversion="1.0"
en38IDREF/IDREFSIDREFS同IDREF,是可以具有由空格分开的多个引用。<!ELEMENT家庭(人+)>
<!ELEMENT人EMPTY>
<!ATTLIST人
relIDID#REQUIRED
parentIDIDREFS#IMPLIED
nameCDATA#REQUIRED
><家庭>
<人relID="P1"name="爸爸"/>
<人relID="P2"name="妈妈"/>
<人relID="P3"parentID="P1P2"name="儿子“/>
</家庭>空格IDREF/IDREFSIDREFS同IDREF,是可以具有39NMTOKEN/NMTOKENS属性类型
名称标记是任何命名字符的混合体只能包含名称字符,不能包含空白字符(空格)所有XML名称都是名称标记,但不是所有的名称标记都是XML名称。例:<!ATTLISTfilenameNMTOKEN#REQUIRED>
文档:<filename=“xml应用.doc”>NMTOKEN/NMTOKENS属性类型
名称标记是任何命名40<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPEpoems[<!ELEMENTpoems(title,content)><!ELEMENTtitle(#PCDATA)><!ATTLISTtitleauthorNMTOKEN#REQUIRED><!ELEMENTcontent(#PCDATA)>]><poems><titleauthor=“杜甫">八阵图</title><content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.</content></poems><?xmlversion="1.0"encoding="gb2312"?><!DOCTYPEpoems[<!ELEMENTpoems(title,content)><!ELEMENTtitle(#PCDATA)><!ATTLISTtitleauthorNMTOKEN#REQUIRED><!ELEMENTcontent(#PCDATA)>]><poems><titleauthor=“杜甫">八阵图</title><content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.</content></poems><?xmlversion="1.0"encoding="41<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPEpoems[<!ELEMENTpoems(title,content)><!ELEMENTtitle(#PCDATA)><!ATTLISTtitleauthorNMTOKENS#REQUIRED><!ELEMENTcontent(#PCDATA)>]><poems><titleauthor=“杜甫">八阵图</title><content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.</content></poems><?xmlversion="1.0"encoding="gb2312"?><!DOCTYPEpoems[<!ELEMENTpoems(title,content)><!ELEMENTtitle(#PCDATA)><!ATTLISTtitleauthorCDATA#REQUIRED><!ELEMENTcontent(#PCDATA)>]><poems><titleauthor=“杜甫">八阵图</title><content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.</content></poems><?xmlversion="1.0"encoding="42NOTATION类型:在记号声明中的名称例如图象、声音、影象等等
<!NOTATIONgifSYSTEM“GIF-View”>NOTATION类型:在记号声明中的名称43NOTATION(续)在下面这个例子中,为"电影"元素指定了两种可选设备:一种是movPlayer.exe,用来播映.mov文件,另一种则用来绘制GIF图象。<?xmlversion=“1.0"encoding="GB2312"?>
<!DOCTYPE文件[
<!ELEMENT文件ANY>
<!ELEMENT电影ANY>
<!ATTLIST电影演示设备NOTATION(mp|gif)#REQUIRED>
<!NOTATIONmpSYSTEM"movPlayer.exe">
<!NOTATIONgifSYSTEM"Image/gif">
]>
<文件>
<电影演示设备="mp"/>
</文件>NOTATION(续)在下面这个例子中,为"电影"元素指定了44ENTITY和ENTITYES属性类型
引用文档中不可解析的外部实体。把外部二进制数据链接到文档。例:<!ATTLISTimagesrcENTITY#REQUIRED><!ATTLISTimagesrcENTITYS#REQUIRED>ENTITY和ENTITYES属性类型
引用文档中不可解析的45属性的缺省设置元素内容说明含义只有默认值如果元素中不包含该属性,解析器将缺省值作为属性值。否则,该属性可以有其他值#REQUIRED元素的每个实例都必须包含该属性#IMPLIED元素的每个实例可以选择是否包含该属性#FIXED元素的属性取值不能更改,只能为设定好的默认值,如果元素的实例中不包含该属性,系统将自动将该默认值作为元素的属性值属性的缺省设置元素内容说明含义只有默认值如果元素中不包含该属46
属性声明可以给属性指定一个默认值,使得当在XML文档中未明确地指定该属性的值时,XML处理器会将此默认值作为该属性的值。属性的默认值可以分别用下面三个关键字进行定义:#REQUIRED、#IMPLIED和#FIXED。3.属性的默认值
3.属性的默认值
47REQUIRED:当一个元素的属性被声明为#REQUIRED之后,那么这个元素在使用时必须具有该属性,否则XML文档就是无效的。IMPLIED:若将一个元素的属性声明为IMPLIED,则该属性可以出现在指定的元素中,也可以缺省,即该属性不是必须使用的。可以包含也可能不包含该属性。FIXED:将一个属性声明为FIXED之后,在相应XML文档中可以不用明确地指定该属性的值,处理器会自动地给出其值;但如果要明确地指出属性值,该值必须是属性定义时给出的默认值。REQUIRED:当一个元素的属性被声明为#REQUIRED48<!ATTLISTpersonnumberCDATA#REQUIRED>XML示例:<personnumber="5677"/><!ATTLISTcontactfaxCDATA#IMPLIED>XML示例:<contactfax=“555-667788”/>或<contact/><!ATTLISTsendercompanyCDATA#FIXED"Microsoft">XML示例:<sendercompany="Microsoft"/><sendercompany=“intel"/><!ATTLISTpaymenttypeCDATA"check">XML示例:<paymenttype="check"/><paymenttype=“nocheck"/><!ATTLISTpersonnumberCDATA49属性综合示例<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPErosterSYSTEM"3.14.dtd"><roster><classid="c101"><monitorip="s101"/><department>信息工程</department><specialty>计算机应用</specialty></class><studentID="s101"type="特长生"><name>李华</name><sex>男</sex><classtoidf="c101"/></student></roster>属性综合示例<?xmlversion="1.0"enco50对应的DTD<?xmlversion="1.0"encoding="UTF-8"?><!ELEMENTroster((class+,student+))><!ELEMENTclass((monitor,department,specialty))><!ATTLISTclassidID#REQUIRED><!ELEMENTmonitorEMPTY><!ATTLISTmonitoripIDREFS#REQUIRED><!ELEMENTdepartment(#PCDATA)><!ELEMENTspecialty(#PCDATA)><!ELEMENTstudent(name,sex?,classto)><!ATTLISTstudentIDID#REQUIREDtype(特长生|非特长生)"非特长生"nationalityNMTOKEN#FIXED"China"><!ELEMENTname(#PCDATA)><!ATTLISTname bynameCDATA#IMPLIED><!ELEMENTsex(#PCDATA)><!ELEMENTclasstoEMPTY><!ATTLISTclasstoidfIDREF#REQUIRED>对应的DTD<?xmlversion="1.0"enco51DTD与XML文档实例的关系1.类与对象2.数据库表结构与数据记录DTD与XML文档实例的关系52XML文档和DTD的匹配DTD的声明内部DTD的声明:<!DOCTYPE根元素名[内部DTD]>外部DTD的声明<!DOCTYPE根元素名称SYSTEM“DTD-URL”><!DOCTYPE根元素名称PUBLIC“DTD-name”“DTD-URL”>内部DTD与外部DTD结合<!DOCTYPE根元素名称PUBLIC“DTD-name”“DTD-URL”[内部DTD]>XML文档和DTD的匹配DTD的声明532.1.2XML文档和DTD的匹配
内部DTD声明内部DTD的语法是:<!DOCTYPE[internal.subset]>其中与XML文档的根元素名相同在DTD中,所有的关键字都是大写。但DTD中所定义的元素大小写是任意的。2.1.2XML文档和DTD的匹配内部DT54内部DTD的缺点:在文档中定义DTD会导致文档本身的长度增加,在传输数据时时,即使不需要验证文档的有效性,这些声明也会随着文档一起传输。如果多个XML文档要共用一个DTD,每个文档中都要加入一个DTD,相当繁琐。内部DTD的缺点:在文档中定义DTD会导致文档本身的长度增加55
外部个人DTD
如果有多个文档要使用同一个DTD,则该DTD可被置于一个单独的文档中(注意DTD文件的文件扩展名为dtd),并在每个使用它的文档中放入一指向它的链接。最简单的方式是提供一个指向该文件的URL。名称的格式是:<!DOCTYPE根元素的名称SYSTEM“外部DTD文件的URI”>例:<!DOCTYPEgreetingSYSTEM“hello.dtd”>外部个人DTD
如果有多个文档要使用同56
外部公用DTD(ExternalPublicDTD)如果某个外部个人(SYSTEM)DTD很通用,可供其他的很多XML共享的话,可以给它一个正式的公用的标识符。首先是给该DTD一个正式的公用的名称。名称的格式是:
-//BigBank//DTDsustomer_support//EN//<!DOCTYPE根元素的名称PUBLIC“DTD的名称”“外部DTD文件的URI”>外部公用DTD(ExternalPubli57例:
外部个人DTD:<!DOCTYPEgreetSYSTEM
“/xml/customer.dtd”>外部公用DTD<!DOCTYPEcustomerPUBLIC
“-//bigbank//DTDcustomer-support//EN//”
“/xml/customer.dtd”>例:
外部个人DTD:58名称以加号(+)或减号(–)开头。加号表示该DTD已经通过像ISO这样的标准组织的批准。减号表示该DTD未经标准化。“//BigBank//DTD”表示编写和维护该DTD的个人或组织。“sustomer_support”是对此DTD的描述,//EN//表示该DTD所用的语言,本例中是英语。DTD具有一个名称的优点是查找该DTD的应用程序可通过名字来查找,并且可以引用其最新版本,而不是在某一特定服务器(使用URL的情况)上的某一特定版本(可能已经过期)。名称的各个部分是:名称以加号(+)或减号(–)开头。加号表示该DTD已经通过像59文档类型定义与文档类型声明的区别:文档类型声明:
<!DOCTYPEgreetSYSTEM“hello.dtd”>文档类型定义:
<!ELEMENTgreet(#PCDATA)>*:文档类型声明包含文档类型定义,但类型定义不可以包含文档类型声明。文档类型定义与文档类型声明的区别:文档类型声明:60
实体的定义
实体有各种类型,如下面所示的分类。但它们所起的作用是相同的。
1、一般实体(General):文档内容中使用的实体。
2、参数实体(Parameter):已经在DTD中使用过的分析实体。实体实体的定义
实体有各种类型,如下面所61
62一般实体
内部实体:将实体所指代的内容已经包含在DTD文件本身中。外部实体:指实体所指代的内容独立于XML文档。XML能过URL定位来引入外部实体;解释实体:一定会被XML解析器所解释并使用的实体。非解释实体:可能被XML解析器忽略的实体。一般实体
内部实体:将实体所指代的内容已经包含在DTD文件本63实体可以指代其他复杂的结构,包括形式规范的XML、其他形式的文本或二进制数据。其中,非解释实体一定是外部实体,故实体可分为三类:内部解释实体(内部实体)外部解释实体外部非解释实体实体可以指代其他复杂的结构,包括形式规范的XML、其他形式的64实体使用标记限制在实体中使用标记时,任何标记字符必须双重转义。XML文档的逻辑结构和物理结构必须一致。实体使用标记限制在实体中使用标记时,任何标记字符必须双重转义65物理结构和逻辑结构
逻辑结构:XML文档、替换文本中的元素。物理结构:文档实体和内部实体。
XML
文档物理结构和逻辑结构逻辑结构:X66内部一般实体格式:<!ENTITY实体名“实体内容”>引用实体方式:“&实体名;”外部一般实体格式:
<!ENTITY实体名SYSTEM“实体内容”>引用实体方式:“&实体名;”内部一般实体67<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPEroster[……<!ENTITYskill1"JAVA程序设计"><!ENTITYskill2"WEB网站设计"><!ENTITYskill3"<Visual程序设计>">]><roster><studentID="n101"><name>李华</name><skill>&skill1;</skill><skill>&skill2;</skill></student><studentID="n102"><name>倪冰</name><skill>&skill1;</skill><skill>&skill2;</skill><skill>&skill3;</skill></student></roster><?xmlversion="1.0"encoding="68使用外部文件定义内部解释实体
outEntity.dtd:<!ELEMENTroster((student+))><!ELEMENTstudent(name,skill*)><!ATTLISTstudentIDID#REQUIRED><!ELEMENTname(#PCDATA)><!ELEMENTskill(#PCDATA)><!ENTITYskill1"JAVA程序设计"><!ENTITYskill2"WEB网站设计"><!ENTITYskill3"<Visual程序设计>">相应的XML:<?xmlversion="1.0"standalone="yes"?><!DOCTYPErosterSYSTEM“outEntity.dtd”><roster><studentID="n101"><name>李华</name><skill>&skill1;</skill><skill>&skill2;</skill></student></roster>使用外部文件定义内部解释实体
outEntity.dtd:相69内部解释实体(内部普通实体)使用外部文档类型定义的优点:
方便XML文档的编写、修改、复用;XML文档的归一化:
将XML文档中的所有实体扩展成它所指代的具体内容;实体的内容必须是完整的XML组成部分;实体中可以嵌套实体;内部解释实体(内部普通实体)使用外部文档类型定义的优点:
方70参数实体参数实体只能在DTD中使用。参数实体可解析。格式:<!ENTITY%实体名“实体内容”>引用实体方式:“%实体名;”4、不可解析实体:二进制文件和图像。
参数实体参数实体只能在DTD中使用。71参数实体的特征参数实体是针对外部DTD所使用的实体。除了在实体声明的定义中可引用其他参数实体外,在元素声明时也可引用参数实体。例:<!ENTITY%h“”><!ENTITYone“%h;”><!ENTITY%p“(#PCDATA)”><!ELEMENTname%p;>参数实体的特征参数实体是针对外部DTD所使用的实体。72实体声明和引用实体一般实体声明后,可在XML文档中引用,不可以在元素声明中引用。
<!ENTITYp“(#PCDATA)”><!ELEMETNname&p;>在实体声明中引用实体时,不能形成死循环。
<!ENTITYp1“&p2;”><!ENTITYp2“&p1;”>实体声明和引用实体一般实体声明后,可在XML文档中引用,不可73实体声明和引用实体参数实体必须在外部DTD中声明,而不能在内部DTD中声明。
<!DOCTYPEbook[<!ENTITY
%p“(#PCDATA)”><!ELEMENTname%p;>在XML文档中只能引用一般实体,引用参数实体并不能达到引用相应内容的效果。实体声明和引用实体参数实体必须在外部DTD中声明,而不能在内74类型一般实体参数实体使用场合用在XML文档中只用在DTD中元素和属性的声明中声明
方式内部<!ENTITY实体名"文本内容"><!ENTITY%实体名"文本内容">外部<!ENTITY实体名SYSTEM"外部文件URI地址"><!ENTITY%实体名SYSTEM"外部文件URI地址">引用方式&实体名;%实体名;类型一般实体参数实体使用场合用在XML文档中只用在DTD75
元素的声明DTD包括属性的声明实体的声明预定义实体
内部解释实体一般实体外部解释实体
外部非解释实体
参数实体
76本章小结DTD设置了有效的XML文档必须遵循的规则。DTD可以分为内部DTD和外部DTD两类。元素的内容可以为#PCDATA、EMPTY、ANY、子元素和混合型内容。#PCDATA表示元素的内容只能是可解析的文本数据。EMPTY表示元素内容为空。ANY表示任意的元素内容。子元素表示元素的内部只能是子元素。混合型内容表示元素的内部可以是可解析的文本数据,也可以是子元素,甚至是两者的结合。如果DTD中的元素名称后面跟有一个星号*,那么这个元素可以不出现、出现一次或多次。如果DTD中的元素名称后面跟有一个星号+,那么这个元素可以出现一次或多次。与星号*不同的是,该元素至少要出现一次。如果DTD中的元素名称后面跟有一个问号?,那么这个元素可以不出现或只出现一次。本章小结DTD设置了有效的XML文档必须遵循的规则。77字符代表“或”,意思是一个或者另外一个命名元素可以出现。有了或字符,就可以选择一个或多个元素。实体根据其所处的位置不同可以分为内部实体和外部实体。内部一般实体是指在XML文档内部定义的并且可以在XML文档中使用的实体。外部一般实体是指实体是在XML文档外部定义,然后通过URL在文档内部进行引用。内部参数实体是指在DTD中定义的并且在只能在DTD中引用的实体。外部参数实体是在文档外部定义了,并且只能在DTD中使用的实体。属性只能出现在开始标记和空元素标记中。属性的声明以ATTLIST开头,后面紧跟属性所述的元素名称,然后才是每个属性的定义。CDATA型数据就是指属性的取值必须是可解析的文本数据。Enumerated型数据是指通过“|”分隔可能的属性值列表,用户可以从这些列表中选取其中的一个作为属性值,而且属性的默认值必须为列表中的一个。ENTITY型数据用于表示外部不可解析的实体,例如二进制文件等。字符代表“或”,意思是一个或者另外一个命名元素可以出现。有了78ENTITYES型数据与ENTITY型类似,不同的是这一类型的属性可以存储一个实体序列。ID型数据是指元素的该类型的属性的取值在XML文档中必须是唯一的,不能出现重复,这种类型的数据通常用于作为元素的标识。IDREF型数据同前面提到的ID型数据有着紧密的关系,它是用于表示XML文档中元素之间的一种联系,它的取值必须是XML文档中被定义好的某一元素的ID类型属性值。IDREFS型数据同IDREF型数据类似,不同之处是这种类型的属性的取值可以是文档中已经定义好多个元素的ID型属性值,这些取值之间必须用空格隔开。NMTOKEN型数据是指不含空格的XML名称,它的作用是对属性的取值进行限制,通俗点讲就是规定了合法的命名机制。ENTITYES型数据与ENTITY型类似,不同的是这一类型79NMTOKENS型数据同NMTOKEN型数据类似,它能够给一个元素的属性赋予多个NMTOKEN类型的数据,不同的NMTOKEN数据之间用空格隔开。NOTATION型数据用于在XML声明特定的记号。属性的缺省值分为三类:#REQUIRED、#IMPLIED和#FIXED。#REQUIRED关键字表示该属性在元素中不可缺少。#IMPLIED表示该属性在包含它的元素中可以出现也可以不出现。#FIXED缺省设置表示该属性的取值保持不变,而且必须指定该属性的默认取值,如果在包含它的元素的实例中没有出现该属性的话,元素就自动取该默认值为属性值。NMTOKENS型数据同NMTOKEN型数据类似,它能够给一80第2章XML数据的底层结构—DTD和XMLSchema2.1XML类型定义语言DTD2.2XML模式Schema
第2章XML数据的底层结构—DTD和XMLSchema81两个基本的概念:1格式良好的XML文档
符合语法的XML文档称为结构良好的XML文档2有效XML文档有效XML文档:内容结构严格遵守它自身的标记说明,能通过自身的语法检查;通过DTD验证的XML文档称为有效的XML文档。格式良好的XML文档与有效的XML文档的区别?有效地XML文档肯定是格式良好的XML文档。反过来,一个格式良好的XML文档不一定是有效的XML文档。有效的XML文档遵守DTD或Schema定义的规则。两个基本的概念:82格式良好XML:<?xmlversion="1.0"encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don'tforgetthemeeting!</body></note>格式良好XML:<?xmlversion="1.0"en83有效(验证)的XML:有效(验证)的XML:84DTD文件:DTD文件:85XMLSchema
XMLSchema
86为什么要用DTD有了DTD,每个XML文件可以携带一个自身格式的描述。有了DTD,不同组织的人可以使用一个通用DTD用来交换数据。应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效可以使用DTD校验自己的XML数据为什么要用DTD有了DTD,每个XML文件可以携带一个自身格87DTD文档类型定义
在xml中,1描述了如何创建DTD,2如何将它与根据它的规则所编写的XML文档相关联,3并且XML处理器如何对DTD进行处理,4有了DTD就可以XML文档的结构是否正确。DTD为XML文档的编写者和处理者提供了共同遵循的标准,使得XML文档有了统一的标准。DTD文档类型定义
在xml中,1描述了如何创建DTD,2882.1XML类型定义语言DTD
(DocumentTypeDefinition)
文档类型定义DTD是一套关于标记符的语法规则,它定义了可用在文档中的元素、属性和实体,以及这些内容之间的相互关系。2.1XML类型定义语言DTD
(Docu89建立XML文档的步骤对相关信息项进行命名,将其映射为相应的元素或属性。确定XML文档的层次结构,即各元素之间的嵌套关系。根据DTD编写相应的XML文档。建立XML文档的步骤对相关信息项进行命名,将其映射为相应的元90元素的定义<?xmlversion="1.0"?><!DOCTYPE员工[<!ELEMENT员工(姓名,性别,出生日期)><!ELEMENT姓名(#PCDATA)><!ELEMENT性别(#PCDATA)><!ELEMENT出生日期(#PCDATA)>]><员工><姓名>李亮</姓名><性别>男</性别><出生日期>1978.2.5</出生日期></员工>例题:元素的定义<?xmlversion="1.0"?>例题91
元素定义
1.元素声明
DTD中所用的第一种声明是元素声明。其形式如下:
<!ELEMENT元素名称元素内容说明>
例:<!ELEMENTnamecontent>
其中,name是一个标准的XML标记的名字。content由以下三种之一组成:元素定义
1.元素声明92关键字EMPTY关键字ANY描述包含在本元素中的子元素的顺序和重复次数的内容模型DTD中声明元素应注意:声明以关键字ELEMENT开头,后面是元素名和包含于元素中的子元素列表。数据类型不是DTD的一个特征。DTD中所定义的每个元素,在对应的XML文档中有且仅有一个。XML区分大小写。关键字EMPTY93元素的声明元素内容说明含义#PCDATA表示元素内部只能是可解析的文本数据EMPTY表示元素为空元素,但是元素中可以包含属性ANY表示元素的内容为任意的内容,可以是空元素、可解析文本数据、子元素、混合型元素中的任意一种子元素表示元素的内容只能是指定顺序和出现次数的子元素混合型内容表示元素的内部可以是可解析的文本数据,也可以是子元素,甚至是两者的结合元素的声明元素内容说明含义#PCDATA表示元素内部只能是可942.元素内容类型(Elementcontentmodel)
元素内容通常有五种情况:EMPTY、ANY、#PCDATA、子元素型和混合型。●EMPTY类型
EMPTY用于定义空元素,即该元素只可能有属性而不会有字符数据或子元素声明空元素的语法是:<!ELEMENTemptyelementEMPTY>例:<!ELEMENT元素名
EMPTY>2.元素内容类型(Elementcontentmode95空模式元素不能包含任何子元素,也不能包含任何数据内容。语法:<!ELEMENT元素名EMPTY>例DTD定义如下:<!ELEMENTpersonEMPTY>对应的XML实例1:<family> <person>花花</person></family>对应的XML实例2:<family><personname=“花花”sex=“M”age=“12”/></family>空模式元素不能包含任何子元素,也不能包含任何数据内容。96●ANY类型这种类型的元素声明是:
<!ELEMENTanyelementANY>
这表明该元素可以包含DTD中定义的其它任何元素或已编译的字符数据。●#PCDATA类型不包含其他子元素而只包含字符数据的元素(如<form>),用关键字#PCDATA进行定义,它代表“已编译的字符数据”(parsedcharacterdata)。
PCDATA可以包含除标记以外的一切字符,包括数字、字母和符号等。被定义为包含PCDATA的元素不能包含任何其他的子元素。●ANY类型97<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPETeam[ <!ELEMENTTeam(Teamname,Country,Member+)> <!ELEMENTTeamname(#PCDATA)> <!ELEMENTCountry(#PCDATA)> <!ELEMENTMember(#PCDATA)>]><Team> <Teamname>ACMilan</Teamname> <Country>Italy</Country> <Member>Pipo</Member></Team><?xmlversion="1.0"encoding="98●子元素类型元素可以包含一系列的子元素,子元素内容模型用于指定某个元素可以包含哪些子元素.
根据子元素间的关系,子元素内容模型可以有两种可能的结构:序列和选择。序列:其所有子元素必须出现且只能出现一次,并且按顺序出现。
<!ELEMENTmessage(header,body,footer)>
注意:序列中不能出现#PCDATA
子元素还可以包含其他子元素。●子元素类型992.选择。
<!ELEMENTelem(x∣y∣z)>选择不能同时包含两个以上的子元素。<!ELEMENT性别(男|女)><!ELEMENTGREETINGS((SEASON|NAME),POSTFIX)><!ELEMENT出行(时间,公交|步行)>2.选择。100●混合类型若某元素既包含子元素又包含已编译的字符数据,则该元素具有混合内容。其声明的语法如下:
<!ELEMENTpick(#PCDATA|one|two|three)*>
注意:必须以#PCDATA开头,*必须放在括号之后,混合类型中不能出现,?,+等符号。●混合类型1013.元素出现次数指示符(Elementoccurrenceindicator)?字符它说明元素可以出现0次或1次。*字符它说明元素可以不出现,或出现1次或多次。+字符它说明元素必须出现至少一次,或者说可以出现一到多次3.元素出现次数指示符(Elementoccurr102例:
<!ELEMENT简历(姓名,性别,年龄,(电话∣手机),家庭住址?,兴趣爱好*,教育经历+,工作经验*)>例:
<!ELEMENT简历(姓名,性别,年龄,(电话∣手103正确的示例:<!ELEMENTMYFILE(TITLE,AUTHOR,EMAIL)><!ELEMENTMYFILE(TITLE|AUTHOR|EMAIL)><!ELEMENTMYFILE(TITLE,AUTHOR?,EMAIL?)><!ELEMENTMYFILE(TITLE+,AUTHOR?,EMAIL)><!ELEMENTMYFILE(#PCDATA|TITLE)*>错误的示例:<!ELEMENTMIX(#PCDATA|SUBEMENT1|SUBEMENT2)+><!ELEMENTMIX(#PCDATA|SUBEMENT1|SUBEMENT2)?><!ELEMENTMIX(SUBEMENT1|SUBEMENT2|#PCDATA)*><!ELEMENTMIX(SUBEMENT1,#PCDATA)*><!ELEMENTmyMessage((#PCDATA|message)*,message)>
正确的示例:104<?xmlversion="1.0"encoding="gb2312"?><!DOCTYPErosterSYSTEM"3.7.dtd"><roster><student><name>李华</name><sex>男</sex><skill>XML</skill><skill>Java</skill><remark><date>2006</date>该生学习较刻苦,但成绩一般
<date>2007</date>该生学习改进了学习方法,成绩有较大进步
</remark></student></roster><?xmlversion="1.0"encoding="105DTD<?xmlversion="1.0"encoding="UTF-8"?><!ELEMENTrosterANY><!ELEMENTstudent((name,sex?,score*,skill+,remark?))><!ELEMENTname(#PCDATA)><!ELEMENTsex(#PCDATA)><!ELEMENTscore(#PCDATA)><!ELEMENTskill(#PCDATA)><!ELEMENTremark(#PCDATA|date)*><!ELEMENTdate(#PCDATA)>DTD106属性定义属性用于将名字--值,对与元素进行关联。属性说明只能在开始标签和空元素标签中出现。属性声明中详细说明了与给定元素相关联的每个属性名,数据类型和缺省值。属性定义属性用于将名字--值,对与元素进行关联。107属性定义1.属性声明属性声明的语法如下:
<!ATTLISTElement_nameAttribute_nameTypeDefault_value>
其中,ATTLIST关键字用来定义元素所具有的属性,Element_name是元素名,Attribute_name是该元素所具有的属性名,Type是属性的类型,(十种类型)最常用的类型是CDATA,Default_value是属性的默认值。<!ATTLIST对应的元素名属性名属性的类型属性默认值>属性定义108★声明属性时应注意以下几点:属性名称遵循的规则与有效的元素名称相同。在一个给定的元素中不能有两个属性同名。若属性值中含有双引号,则该属性值应用单引号括起来。
★声明属性时应注意以下几点:109设置属性的类型元素内容说明含义CDATA可解析的文本数据Enumerated枚举型数据ENTITY在DTD中声明的实体ENTITYES在DTD中声明的若干实体ID文档中唯一的取值IDREF文档中某个元素ID属性值IDREFS文档中若干个元素的ID属性值NMTOKEN任意不含空格的XML名称NMTOKENS多个XML名称NOTATION在DTD中声明的记号名设置属性的类型元素内容说明含义CDATA可解析的文本数据110类型描述CDATA值为字符数据(characterdata)(en1|en2|..)此值是枚举列表中的一个值ID值为唯一的idIDREF值为另外一个元素的idIDREFS值为其他id的列表NMTOKEN值为合法的XML名称NMTOKENS值为合法的XML名称的列表ENTITY值是一个实体ENTITIES值是一个实体列表NOTATION此值是符号的名称xml:值是一个预定义的XML值类型描述CDATA值为字符数据(characterdat1112.属性的类型
CDATA属性类型:字符数据
<!ATTLISTpersonnameCDATA#REQUIRED><?xmlversion="1.0"encoding="GB2312"?>
<!DOCTYPE剧本[
<!ELEMENT剧本ANY>
<!ELEMENT对话(#PCDATA)>
<!ATTLIST对话演员CDATA>
]><剧本>
<对话演员
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西中医药大学《建筑与装饰工程估价》2023-2024学年第二学期期末试卷
- 陕西学前师范学院《混凝土结构基本原理课程设计》2023-2024学年第二学期期末试卷
- 陕西工商职业学院《识别设计》2023-2024学年第二学期期末试卷
- 陕西旅游烹饪职业学院《英语写作1》2023-2024学年第二学期期末试卷
- 陕西理工大学《工程项目管理信息系统及软件应用》2023-2024学年第一学期期末试卷
- 陕西省咸阳市泾阳县2024-2025学年高三第四次月考(化学试题)试题含解析
- 陕西省安康市石泉县2024-2025学年四年级数学第二学期期末达标检测试题含解析
- 陕西省山阳县2025届初三第五次考试物理试题含解析
- 安全隐患排查(新)
- 陕西省汉中学市镇巴县市级名校2025届初三5月模拟(三模)物理试题文试题含解析
- 2025届高考作文备考训练:局中局外人生如棋
- 山东省威海市乳山市银滩高级中学2024-2025学年高一下学期3月月考思想政治试题(含答案)
- 中华武术-太极知到课后答案智慧树章节测试答案2025年春武汉城市职业学院
- 2023-2024学年广东省深圳市龙岗区八年级下学期期中语文试题及答案
- 陕西省部分学校2024-2025学年高三下学期联考物理试卷(原卷版+解析版)
- 幼儿园获奖公开课:中班数学活动《认识8》课件
- 钩机清理合同范文5篇
- 医务人员手卫生培训
- 第6课 隋唐时期的中外文化交流 【公开课一等奖创新教学设计】-【教学评一体化】大单元整体教学
- 幼教培训课件:《幼儿园思维共享的组织与实施》
- 2025年中考英语时文阅读:6篇有关电影哪吒2的英语阅读及相关题目(无答案)
评论
0/150
提交评论