




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章XML数据的底层结构3.1有效的XML文件3.2如何检查XML文件的有效性3.3XML文件与DTD的匹配3.4XML文档类型定义文件DTD符合XML语法规则的XML文件称为规范的XML文件,也称为良构的XML文件。规范的XML文件再符合额外的一些约束,就称为有效的XML文件。3.1有效的XML文件(1)
这些额外的约束就是DTD(DocumentTypeDefinition,文档类型定义)和XMLSchema。例如,下面的文件就是一个有效的XML文件:3.1有效的XML文件(2)
<?xmlversion="1.0"?><!DOCTYPEpersions[<!ELEMENTpersions(persion*)><!ELEMENTpersion(name,sex,age)><!ELEMENTname(#PCDATA)><!ELEMENTsex(#PCDATA)><!ELEMENTage(#PCDATA)>]><persions><persion><name>xiaowang</name><sex>male</sex><age>25</age></persion></persions>
文件中的每一个标记都在DTD中做了定义,而且满足相应的约束条件。
返回浏览器只是检查XML文件的规范性,并不能验证XML文件是否遵守其对应的约束文件中的约束条件。所以检查文件的有效性还需要通过解析器来进行。本例通过DOM解析器来检验XML文件的有效性。文件MyHandler.java称为事件处理器,用于检验XML文件的有效性并处理XML文件的错误信息,具体代码如下:
3.2如何检查XML文件的
有效性(1)
importorg.xml.sax.helpers.DefaultHandler;importorg.xml.sax.SAXParseException;importorg.xml.sax.SAXException;public
class
MyHandler
extends
DefaultHandler{String
em=null;public
voiderror(SAXParseExceptione)throws
SAXException{
em=e.getMessage();//一般性错误,一般为有效性错误System.out.println("一般错误"+em);}public
void
fataError(SAXParseExceptione)throws
SAXException{
em=e.getMessage();//严重错误,一般为规范性错误System.out.println("致命错误"+em);}}
3.2如何检查XML文件的
有效性(2)//获得解析工厂DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//设置解析器支持有效性检查factory.setValidating(true);//创建DOM解析器DocumentBuilderbuilder=factory.newDocumentBuilder();//实例化事件处理器MyHandlerhandler=new
MyHandler();//绑定处理器builder.setErrorHandler(handler);//解析并检验文件XML文件Documentdocument=builder.parse(newFile(file));//如果返回的错误信息为空,说明是一个有效的XML文件,否则是无效的if(handler.em==null){System.out.println("文件"+file+"是有效的XML文件。");}else{System.out.println("文件"+file+"是无效的XML文件。");}文件XMLValidate.java负责创建DOM解析器,分析XML文件,主要代码如下:
3.2如何检查XML文件的
有效性(3)利用这个检验程序检验前面的XML文件,得到的结果如下图所示:
如果去掉“<persion>”中的子标记“<age>”,再进行有效性检验,得到的结果如下图所示:
3.2如何检查XML文件的
有效性(4)如果利用了XML开发工具,会很方便的进行规范性及有效性的检验。例如使用XMLWritwer。返回
XML文件与DTD的匹配是指约束一个XML文件的DTD的来源,在XML文件中,通过文档类型声明来指定DTD的来源,按来源不同可分为内部DTD和外部DTD。3.3
XML文件与DTD的匹配
(1)内部DTD包含在XML文件内部的DTD称为内部DTD,在XML中内部声明DTD的格式为:<!DOCTYPE根标记名称[DTD内容(标记的定义及约束)]>
内部DTD示例。3.3
XML文件与DTD的匹配
(2)外部DTD在XML文件外部定义的DTD称为外部DTD,在XML文件中声明外部DTD的格式为:
<!DOCTYPE根标记名称SYSTEM“DTD的URI”><!DOCTYPE根标记名称
PUBLIC“正式公用标识符”“DTD的URI”>
“SYSTEM”表示使用的DTD文件是一个个人的非标准化的外部DTD,即没有被大部分人或某一领域所认可。“PUBLIC”表示所使用的外部DTD文件是一个公用的标准化的DTD文件。“正式公用标识符”用来表明DTD文件的特征,其格式为:
-ISO认证//单位名称//DTD说明//所用的语言
“DTD的URI”表示DTD文件所在的位置,必须是一个有效的资源。
3.3
XML文件与DTD的匹配
(3)联合使用内部DTD和外部DTD如果想既不影响外部DTD的标准性,又添加自己的内容,就可以联合使用内部DTD和外部DTD
。其格式为:
<!DOCTYPE根标记名称SYSTEM“DTD的URI”[
内部DTD]>或<!DOCTYPE根标记名称PUBLIC“正式公用标识符”“DTD的URI”[
内部DTD]>解析器在解析时,会把这两个部分合并称为一个DTD,所以,对于同一个标记,不能在两个部分中同时定义,即使它们的约束条件相同。返回3.4XML文档类型定义文件DTD
3.4.1DTD的元素
3.4.2DTD的完整性
3.4.4DTD与名称空间
3.4.3DTD的属性定义
3.4.5DTD的实体
3.4.6DTD中的参数实体
3.4.7DTD中的注释
返回DTD的元素(1)
DTD中的元素(ELEMENT)是用来约束标记的,用元素声明来定义一个标记,元素声明以“<!ELEMENT”开始,用“>”结束,格式为:
<!ELEMENT标记名称
标记的约束>
例如:
<!ELEMENTname(#PCDATA)>这段代码定义了一个标记,名称为name,它标记的内容只能含有文本数据。注意:元素声明中“<”与“!”之间以及“!”与“ELEMENT”之间不能有空格。
DTD的元素(2)
如果想要定义一个标记含有哪些子标记以及子标记应该以怎样的顺序出现或出现的次数,这些内容都要在“标记的约束”中定义。标记的约束可以以下3种情况:
(1)EMPTY。(2)ANY。(3)描述该标记可包含的子标记及其出现次数等信息。
DTD的元素(3)
以上的3种情况可具体分为下列4种类型:
(1)EMPTY关键字EMPTY用于定义空标记,空标记不含有任何标记内容。例如,对于下面的一个空标记:<abc/>在DTD中声明该标记的语法是:<!ELEMENTabcEMPTY>DTD的元素(4)
(2)ANY
使用关键字ANY就意味着该标记可以包含该DTD中定义的其他任何标记,多用于定义根标记。例如:<!ELEMENTpersionsANY>这段代码定义了一个名称为persions的标记,它的子标记可以是在该DTD文件中定义的其他任何标记。说明:在DTD中应慎用ANY,因为,过多地使用ANY会破坏文档结构清晰这一原则。DTD的元素(5)
(3)#PCDATA如果约束条件是#PCDATA,说明该标记所标记的内容可以是除标记以外的任何字符。例如:
<!ELEMENTname(#PCDATA)>这段代码定义了名称为name的标记,同时规定了标记<name>所标记的内容只能是文本数据,不能含有子标记。DTD的元素(6)
(4)定义子标记
标记的内容可以包含子标记,定义一个标记的子标记的语法格式为:
<!ELEMENT标记名称
(子标记列表)>
例如:
<!ELEMENTpersion(name,sex,age)>
这段代码定义了一个名称为persion的标记,该标记含有3个子标记<name>、<sex>和<age>。定义子标记时子标记的出现顺序决定了XML文件中子标记出现的顺序,这个次序不能违背,否则,XML文件也不是一个有效的XML文件。
注意:子标记序列中不能有#PCDATA。DTD的元素(7)
DTD中就引入了几个特殊符号来说明子标记的出现情况情况。分别是“?”、“*”和“+”,用这些符号来指定标记出现的错误,具体含义分别是:
(1)“?”:说明该标记可以出现0次或1次。(2)“*”:说明该标记可以出现1次或多次,或者不出现。(3)“+”:说明该标记至少要出现一次。如果没有符号标记,表示该标记必须出现且只能出现一次。DTD中还有一个字符“|”,用于可选的子标记。返回DTD的完整性(1)
一个完整的DTD,应满足下面两个条件:(1)不能出现标记的嵌套
(2)必须确定每一个标记的约束条件
DTD的完整性(2)
(1)不能出现标记的嵌套
标记的嵌套是指一个标记的子标记中又含有该标记的父标记,这种情况在DTD中是不允许出现的。例如:
<!ELEMENTelem_a(elem_b,elem_c)><!ELEMENTelem_b(elem_a,elem_c)>这个DTD中的定义是错误的。DTD的完整性(3)
(2)必须确定每一个标记的约束条件
对于XML文件中出现的每一个标记,在DTD中都应该有它所标记内容的约束。例如:
<!ELEMENTpersions(persios)<!ELEMENTpersion(name,sex,age)><!ELEMENTname(#PCDATA)>其中,只对“name”进行了约束,因此它是一个错误的DTD。不满足上面任何一点的DTD都不是一个完整的DTD。
返回DTD的属性定义(1)
标记都可以含有属性,是标记的附加信息。与标记的定义类似,属性的定义也必须在DTD中声明。DTD中的属性列表(ATTLIST)是用来约束标记的属性的,属性的声明以“<!ATTLIST”开始,用“>”结束,中间是标记名称及其可以含有的属性列表,其语法格式为:
<!ATTLIST标记名称属性名称属性类型属性默认值情况属性名称属性类型属性默认值情况……>
DTD的属性定义(2)
例如:
<!ATTLISTcar typeCDATA“A2” colorCDATA“red”
max-speedCDATA“120”>也可以多次为一个标记定义属性。例如:<!ATTLISTcartypeCDATA“A2”><!ATTLISTcarcolorCDATA“red”><!ATTLISTcarmax-speedCDATA“120”>注意:XML文件中为每个标记添加的属性,都应该在DTD中声明。即使是同名的属性也要各自声明。DTD的属性定义(3)
属性的名称:属性名称可以自由定义,命名方法和标记的命名方法相同,名称可以由字母、数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,不能含有空格;名称必须以字母或下划线开头。属性名区分大小写。
属性类型:属性的类型可以有7种情况,CDATA类型、枚举类型、ID属性类型、IDREF/IDREFS类型、NMTOKEN/NMTOKENS类型、ENTITY/ENTITYS类型和NOTATION类型。
DTD的属性定义(4)
各种类型的说明见下表:
属性类型含义描述CDATA文本数据枚举类型把属性的可能取值一一列举,如:(male|female)ID属性类型用于标识文档中的标记,ID属性的值必须是一个合法的XML名称且在文档中是唯一的IDREF/IDREFS类型IDREF类型用于引用同一文档中另一个标记的ID值,IDREF属性值必须是文档中某个标记的ID属性值。IDREFS是IDREF的复数形式,其值是若干个ID属性值,之间用空格分开NMTOKEN/NMTOKENS类型NMTOKEN类型属性值必须是有效的XML名称,不能含有空格。NMTOKENS是NMTOKEN的复数形式,可包含若干个有效XML名称,可包含空格ENTITY/ENTITYS类型用于引用文档中的不可解析的外部实体,其值必须是有效的XML名称NOTATION类型用于将属性的值和DTD中的<!NOTATION>声明关联DTD的属性定义(5)
属性默认值情况属性的默认值情况可以是:字符串、“#IMPLIED”、“#REQUIRED”或“#FIXED”和一个字符串,具体用法见下表:属性类型含义描述字符串XML标记必须含有该属性,可以不明显的添加,有默认值#IMPLIEDXML标记可以不含有该属性,没有默认值#REQUIREDXML标记必须含有该属性,没有默认值,必须显示地添加#FIXED和一个字符串XML标记可以不含有该属性,若添加了该属性,其值是“#FIXED”后面的字符串,且不可改变。返回DTD与名称空间
名称空间是用来区分相同名称的标记,名称空间在标记的开始标记中声明,作用域是该标记所标记的内容,除非该标记的子标记又声明了名称空间。名称空间分为有前缀的名称空间和无前缀的名称空间。名称空间也可以在DTD中声明,W3C允许在DTD中用“ATTLIST”声明来约束标记的名称空间。格式为:
<!ATTLIST标记名称
xmlns[:前缀]CDATA约束条件>
例如:
<!ATTLISTcarxmlnsCDATA#FIXED“jilin”><!ATTLISTbusxmlns:pCDATA#REQUIRED>注意:如果XML文件中的某个标记必须使用名称空间,那么,在DTD中定义该标记时,该标记也必须使用名称空间的前缀。
返回DTD的实体(1)
DTD中的实体分为普通实体和参数实体,普通实体简称为实体。普通实体指可以被XML文件在标记内容中通过实体引用使用的实体。按实体内容的位置分为内部实体和外部实体。按可解析与不可解析分为可解析实体和不可解析实体。解析器在解析XML文件数据时,会将实体应用部分替换为预定义实体的内容。
内部实体与外部实体
内部实体是指实体内容包含在该DTD文件中的实体。外部实体指的是实体内容是该DTD文件以外的其他文件的实体。
DTD的实体(2)
内部实体与外部实体
内部实体的声明:DTD中定义内部实体的格式如下:<!ENTITY实体名字“实体内容”>例如:
<!ENTITYPI“3.14159”>外部实体的声明:DTD中定义内部实体的格式如下:<!ENTITY实体名字SYSTEM“实体的URI”><!ENTITY实体名字
PUBLIC“实体的URI”>例如:
<!ENTITYNoteSYSTEM“a.txt”>DTD的实体(3)
内部实体与外部实体
实体的引用:在XML文件中实体引用的格式为:
&实体名称;例如:
圆周率的值是:&PI;解析器在解析时,就会将“&PI;”替换为“3.14159”。注意:实体引用时,“&”、“实体名称”和“;”之间都不能有空格。
DTD的实体(4)
内部实体与外部实体
实体的引用的例子:DTD中定义实体如下:<!ENTITYinen"我是内部实体"><!ENTITYoutenSYSTEM"05.txt"><!ELEMENT实体引用(内部实体,外部实体)><!ELEMENT内部实体(#PCDATA)><!ELEMENT外部实体(#PCDATA)>文件05.txt的内容:我是外部实体,来自05.txt。
DTD的实体(5)
内部实体与外部实体
实体的引用的例子:XML文件代码如下:<?xmlversion="1.0"encoding="gb2312"?>
<实体引用><内部实体>&inen;</内部实体><外部实体>&outen;</外部实体></实体引用>程序运行结果如图所示:
DTD的实体(6)
可解析实体与不可解析实体可解析的实体是指实体的内容是能被解析器解析的数据。例如:
“3.14159”、“Howareyou?”、“a+b>c”解析器会把它们解析为:“3.14159”、“Howareyou?”、“a+b>c”。所以,它们都称为可解析的实体。不可解析的实体是指实体内容包含解析器不能解析的数据的实体。不可解析的数据通常指二进制数据、图片文件等。返回DTD中的参数实体
(1)参数实体是指在DTD文件中定义,只能由DTD文件本身通过实体引用来使用的实体,和关联的XML无关。通过参数实体的使用,可以大大减少编写重复代码所带来的工作量。参数实体分为内部参数实体和外部参数实体。DTD中内部参数实体定义格式为:
<!ENTITY%参数实体名
“参数实体内容”>
DTD中外部参数实体定义格式为:
<!ENTITY%参数实体名
SYSTE(PUBLIC)
“实体的URI”>
DTD中的参数实体(2)例如:
注意:“%”两边都要有空格,内部参数实体的“参数实体内容”为文本数据,其中如果包含特殊字符(“<”、“>”、“&”、“’”和“””),要通过预定义实体引用来使用。外部参数实体的“实体的URI”
必须是有效资源。参数实体必须先定义后使用。<!ENTITY%persion
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届吉林省长春市高三11月质量监测(一)-政治试题(含答案)
- 2025成都市房地产抵押合同示范文本
- 2025绿色蔬菜购销合同
- 班级课堂纪律维护的策略分析计划
- 2025河北省煤炭购销合同范本
- 运用多媒体提升课堂教学效果计划
- 原水取水点安全防范措施计划
- 地产基础知识培训终稿
- 企业并购中的财务评估计划
- 现代信息技术在教学中的应用计划
- 操作规程:视频监控系统的维护和巡检
- 安全警示牌完
- 《矿产地质勘查规范 花岗伟晶岩型高纯石英原料》(编制说明编写要求)
- 《电子线路CAD》课程标准
- 《扁桃体摘除术》课件
- 市场推广服务费合同
- NB-T 47013.15-2021 承压设备无损检测 第15部分:相控阵超声检测
- 湿地公园运营投标方案(技术标)
- 完整版新概念第一册笔记(张云生)word版
- 白塞病诊断和治疗课件
- 基准地价技术报告
评论
0/150
提交评论