版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章有效的XML文件王金英2009-10-112本章主要内容有效的XML文件怎样检查有效性DTD中的元素DTD中的属性约束列表内部DTDDTD与名称空间难点DTD中的属性约束列表DTD与名称空间第3章导读3.1有效的XML文件概述peopleForm1.xmlpeopleForm2.xml对于解析器,两个文件的数据结构完全不同,某些系统对用XML组织数据有一定特殊要求.XML的数据结构进行约束有两种方式:
使用文档类型定义(DocumentTypeDefinitionDTD)和XMLSchema模式有效的XML文件:如果和某个DTD文件相关联,并且遵守该DTD文件规定的约束条件,就称之为有效的XML文件.难点:怎样用XML来合理地组织数据1:初识DTD如peopleForm2.xml要求:刻画一个用户基本信息的XML文件,同时数据结构要求:(1)要标记的名称是”手机用户表”(2)根标记可以有若干个名称为”用户”的子标记.(3)名称为”用户”的标记有且仅有一个名称为”号码”的子标记,有且仅有一个名称为’姓名’的子标记.(4)名称为”号码”的标记中的内容只能是文本数据,不能有子标记(5)名称为”姓名”的标记中的内容只能是文本数据,不能有子标记.用DTD文件来约束一个XML文件符合以上要求.1:DTDDTD由元素构成的文本文件<!ELEMENT标记名称标记的约束条件>如DTD文件first.dtd<!ELEMENT手机用户表(用户*)><!ELEMENT用户(号码,姓名)><!ELEMENT号码(#PCDATA)><!ELEMENT姓名(#PCDATA)>2:保存DTD文件扩展名为dtd,保存时所选编码需与其关联的XML文件一致.DTD所要约束的XML文件的编码为UTF-8,则DTD文件也要按照UTF-8编码保存.例first.dtd什么是有效的XML文件?一个规范的XML文件如果和某个DTD文件相关联,并遵守该DTD文件规定的限制条件就称为有效的XML文件。FORMOREINFO...DTD文件的编码必须与相关联的XML文件一致。当你保存文件时如果系统总是给你加上”.txt”,那你就要在文件名上加上双引号3:XML文件与DTD文件的关联一个XML文件只有和某个DTD文件相关联,才会受到该DTD文件的约束那么,这个XML文件也是一个有效的XML文件XML中使用“文档类型声明”与一个DTD文件相关联.形式:SYSTEM关联由个人或工作小组所定义且认可PUBLIC所关联的DTD文件已经得到某一领域的认可,是经过许多人讨论得到认可的DTD文件使用SYSTEM文档类型声明的格式<!DOCTYPE手机用户表SYSTEM“DTD文件的URI”>3:XML文件与DTD文件的关联例,一个根标记名字是”手机用户表”的XML文件,使用声明
<!DOCTYPE手机用户表SYSTEM“first.dtd”>使用PUBLIC文档类型声明的格式
<!DOCTYPE根标记的名称PUBLIC“正式公用标识符”“DTD文件的URI”><!DOCTYPE手机用户表PUBLIC“-//ISO123456/Daxian/ForXML/EN”“first.dtd”>3:XML文件与DTD文件的关联在PUBLIC文档类型声明中正式公用标识符(FormalPublicIdentifier,FPI)格式为:“-ISO认证//单位名称//DTD说明//所用语言”FPI中不可以含有非ASCII码字符“DTD文件的URI”:必须为有效的资源,该文件必须和当前XML文件在同一目录中,如果是URI,必须是可以访问的,让URI是一个有效的网络资源,许多组织的XML文件共享同一个DTD文件的约束.3:XML文件与DTD文件的关联例example3_2.xml该文件与first.dtd需保存在同一目录中,example3_2.xml的数据结构满足first.dtd文件给的约束条件,则XML文件就是有效的XML文件.XML中使用的与DTD相关联的”文档类型声明”一定写在XML声明的后面,XML声明必须写在XML文件的最前面.3.2怎样检查有效性浏览器只能检查XML文件是否规范,所关联的DTD文件是否有语法错误,但不能检查有效性.运用DOM解析器来验证TestValidate.java输入example3_2.xml是有效的,修改example3_2_1.xml,变为无效的3.3.定义元素及其子元素元素之间的父子关系构成了一种层次结构。
XML文件与DTD的匹配是指约束一个XML文件的DTD的来源,在XML文件中,通过文档类型声明来指定DTD的来源,按来源不同可分为内部DTD和外部DTD。XML文件与DTD的匹配在DOCTYPE声明体中包含文档类型定义内容在独立的DTD文件中提供文档类型定义内容混合使用公用DTD
一种由权威机构制订的,提供给特定行业或公众使用的外部DTD。引用公共DTD的形式为:
<!DOCTYPE根元素PUBLIC"DTD名称""外部DTD的URL或URI">
PUBLIC关联型PUBLIC关联型文档类型声明格式<!DOCTYPE
根标记的名称
PUBLIC
“正式公用标识符”
“DTD文件的URI”>FORMOREINFO...正式公用标识符(FormalPublicIdentifier,FPI)格式:
“-//ISO认证//单位名称//DTD说明//所用语言”
例子:<!DOCTYPEemployeePUBLIC “-//ISO123456//ccutsoft//ForXML//EN” “/dtds/chapt3/a.dtd”>注:FPI中不可以有非ASII码字符2.定义重复元素
在DTD定义中还可以使用一些符号来描述可能重复出现的元素。AND,要求严格按顺序,OR,或|一组要共同匹配的表达式()可选,不出现或出现一次?出现零次或多次*出现一次或多次+含
义元素字符3.定义选择项
例3.11:在描述公司联系信息时,对于“联系方式”这种元素假设:“联系方式”必须包含一个或多个“EMAIL地址”,或包含一个“电话号码”。其DTD定义为:
<!ELEMENT联系方式(EMAIL+|电话号码)>
注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。要想使用多种连接符,只有通过创建子组的方式。例如:<!ELEMENT联系人(姓名,电话|EMAIL)>不合法
可写成:<!ELEMENT联系人(姓名,(电话|EMAIL))>
3.3DTD中的元素<!ELEMENT标记名称标记的约束条件><!ELEMENTbook(ISBN,name)>约束XML文件中名字为”book”的标记有且仅有名字为”ISBN”和”name”的两个子标记标记的约束条件如果有(),那么小括号必须是用英文输入法输入的.DTD文件中元素的作用与其在DTD文件中的书写位置无关.在DTD文件中不能使用多个元素约束同一个标记,即使约束条件相同也不可以.1:子标记<!ELEMENT标记名称标记的约束条件><!ELEMENT标记名称(子标记列表)><!ELEMENT开车时间(hour,minute)>约束XML文件中名字为”开车时间”的标记恰好包含两个子名字为”hour”和”minute”的子标记,不可以包含能显示的文本.先后顺序必须是hour和minute1:子标记子标记列表:尾加模式限定符号来限定标记出现的次数,不加限定符号的出现且仅出现一次.+:子标记必须出现一次或多次-:子标记可以出现零次或多次?:子标记可以现现零次或一次例<!ELEMENT用户(号码+,姓名)>可以由一个或连续多个号码子标记,但后面有且仅有一个姓名子标记.例example3_4.xml
four.dtdexample3_4_1.xml1:子标记几个标记的或运算,必须用小括号括起来<!ELEMENT应聘者(姓名,(专科|本科|研究生),(男|女))><!ELEMENT应聘者(姓名,(奖励|处分)*,(男|女))>例five.dtd
example3_5.xml2:约束标记只包含文本数据<!ELEMENT标记名称(#PCDATA)>#PCDATA只可以包含文本数据(普通字符、CDATA段、特殊字符的实体引用)#PCDATA也可以是一个“空子符”,甚至可以是一个空标记<!ELEMENTHello(#PCDATA)>下面均符合规则<Hello>你好</Hello><Hello></Hello><Hello/>不符合要求的<Hello>你好<speak>byebye</speak></Hello>3:约束标记的混合内容允许标记内容可以有可显示的文本数据,也可以有子标记,标记的约束条件是关键字“#PCDATA”和若干个子标记的“或运算”,而且“或运算”必须用小括号括起来并后缀一个“*”,<!ELEMENT标记名称(#PCDATA|子标记1|子标记2…|子标记m)*>注意:标记的约束条件必须用“*”结尾3:约束标记的混合内容DTD文件中对XML文件中标记包含的混合内容进行约束的元素只能约束标记包含的内容,是能显示的文本数据和子标记。可显示的文本数据可以出现,也可以不出现子标记可以出现零次或多次。只能约束该标记可以有哪些子标记,不能约束这些子标记出现的次数和出现的顺序。约束条件中也不能使用限制符号。(#PCDATA|子标记1+|子标记2*…|子标记?)例3-6six.dtd
example3_6.xml混合元素比较复杂,约束能力有限,一般不提倡使用混合元素4:EMPTY和ANYEMPTY:约束一个标记为空标记或只能包含有空字符的非空标记ANY:不对一个标记有任何约束<!ELEMENTspeakEMPTY><!ELEMENThelloANY>符合约束的标记<speak/><speak></speak><hello>qweqwe</hello>不符合约束条件的标记<speak>Howareyou</speak><speak></speak>3.4DTD的完整性(1)
一个完整的DTD,应满足下面两个条件:(1)不能出现标记的嵌套
(2)必须确定每一个标记的约束条件
3.4DTD的完整性(2)
(1)不能出现标记的嵌套
标记的嵌套是指一个标记的子标记中又含有该标记的父标记,这种情况在DTD中是不允许出现的。例如:
<!ELEMENTelem_a(elem_b,elem_c)><!ELEMENTelem_b(elem_a,elem_c)>这个DTD中的定义是错误的。3.4、DTD的完整性(3)
(2)必须确定每一个标记的约束条件
对于XML文件中出现的每一个标记,在DTD中都应该有它所标记内容的约束。例如:
<!ELEMENTpersions(persios)<!ELEMENTpersion(name,sex,age)><!ELEMENTname(#PCDATA)>其中,只对“name”进行了约束,因此它是一个错误的DTD。不满足上面任何一点的DTD都不是一个完整的DTD。
3.4DTD的完整性不允许无穷嵌套Error<!ELEMENT商品名称(name,price)><!ELEMENTprice(商品名称,unit)>XML文件中的每个标记都必须在DTD中有相应元素对其进行约束error<!ELEMENT列车时刻表(T28次,T29次)><!ELEMENTT28次(hour,minute)><!ELEMENTT29次(minute,hour)3.5定义属性
在DTD中定义属性的格式:
<!ATTLIST
元素名(属性名属性类型缺省值)*>其中,*表示可以定义多个属性。属性类型可以为下列表格中的任意一种:
类型含义CDATA纯文本Enumerated枚举类型:只能从给定的值的列表中选择一个ID特定文档中具有唯一性的名称IDREF引用ID值IDREFS一系列以空格分隔的ID值ENTITY在DTD中声明的实体名ENTITIES在DTD中声明的若干个实体的名字,彼此间由空格分隔NMTOKENXML名称NMTOKENS由空格分开的多个XML名称NOTATION在DTD中声明的符号缺省值有以下4种表示方法:
#REQUIRED:表示该属性必须出现,而且在XML文档中必须为这个属性提供一个值。#IMPLIED:表示该属性可有可无,视需求来设置。解析器不强行要求在XML文档中给出该属性的值,而且也无须在DTD中为该属性提供缺省值。#FIXED:表示该属性取固定值,在DTD中必须为这种特定的属性提供一个缺省值,并且不允许XML文档的编写者用别的值替代它。缺省值:在DTD中定义一个缺省值,但在XML文件中可以使用缺省值,也可以以新的属性值来覆盖事先定义的缺省值。
对于提供缺省值的属性(#FIXED和缺省值),如果在XML文档中不指定该属性,解析器会自动补上。属性类型含义描述字符串XML标记必须含有该属性,可以不明显的添加,有默认值#IMPLIEDXML标记可以不含有该属性,没有默认值#REQUIREDXML标记必须含有该属性,没有默认值,必须显示地添加#FIXED和一个字符串XML标记可以不含有该属性,若添加了该属性,其值是“#FIXED”后面的字符串,且不可改变。3.5DTD中的属性约束列表不要因为属性的频繁使用破坏XML的数据结构ATTLIST属性约束列表对于有效的XML文件,标记的每个属性在DTD中都必须有相应的ATTLIST属性约束列表。<!ATTLIST标记名称
属性名称属性类型默认值情况
属性名称属性类型默认值情况
……><!ATTLIST中的<、!、ATTLIST之间不能有空格3.5DTD中的属性约束列表<!ATTLIST长方体widthCDATA“0”heightCDATA“0”lengthCDATA“0”><!ATTLIST姓名性别CDATA“男”>
例3.7sevent.dtd
example3_7.xml尽管没有显式写出另外两个姓名标记的属性,但解析器认为有。1:属性规则属性名称:由字母,数字,下划线,点,连字符组成,但必须以字线或下划线开头,名称区分大小写属性类型:属性值一定是字符串,那么属性类型就决定了属性可以用什么字符串作为它的值。值不能有<、>、&、‘、“区分大小写默认值情况:2:属性的默认值1:默认值情况是字符串标记必须有该属性,且有默认值例3-8eight.dtd
example3_8.xml2:默认值情况是#IMPLIED
一个属性可有可无且没有默认值3:默认值是#REQUIRED不为属性设置默认值,但必须加该属性4:默认值是#FIXED字符串
不让某个属性的默认值不再发生变化例3—9nine.dtd
example3_9.xml
验证并浏览例3_10ten.dtd
example3_10.xmlexample3_10_1.xml3:属性类型属性类型:CDATA、Enumberated、NMTOKEN、NMTOKENS、ID、IDREF、IDREFSA:CDATA:属性值可以是任意字符串,不能含有()&‘“例3_11eleven.dtdexample3_11.xmlB:EnumberatedB:Enumberated:属性值只可以是枚举值<!ATTLIST标记名称属性名称(属性值1|属性值2|…|属性值n)默认值情况>属性值可由字母、数字、下画线、点、连字符,并允许首字符是数字字符。例3_12twelve.dtd
example3_12.xmlexample3_12_1.xmlC:NMTOKEN属性值可由字母、数字、下画线、点、连字符组成,不能含有空格字符,可以用数字、点、连字符开头例3—13thirteen.dtd
example3_13.xmlexample3_13_1.xmlD:NMTOKENS某个属性的属性值含有空格,且被空格分开的子字符串符合NMTOKEN类型例3-14fourteen.dtd
example3_14.xmlE:ID属性值有专有性,类型相同的属性取值不能相同属性值可由字母、数字、下划线、点、连字符,必须以字母或下划线开头默认值情况:只能是#REQUIRED和#IMPLIED例3-15fifteen.dtd
example3_15.xmlExample3_15_1.xmlF:IDREF可通过标记的属性值来判断标记之间的联系。IDREF类型取值只能取某个标记中的ID类型属性的属性值即指父子关系,也指普通关系例3-16sixteen.dtd
example3_16.xmlexample3_16_1.xmlG:IDREFS属性值由若干个其他ID属性的属性值的组合,它的值可以是用空格分隔的若干个其他ID属性的属性值例3-17example3_17.xml
sevent.dtd<!ATTLIST标记名称属性名称属性类型默认值情况><!ATTLIST张三headNMTOKEN#REQUIRED>#REQUIRED:约束张三必须有head属性NMTOKEN:约束head取值必须是一个不含空格的字符串3.6内部DTDDTD文件可以直接写在XML文件内部,称内部DTD。<!DOCTYPE根标记名称[开始,以]>结束内部DTD要写在XML声明之后和根标记的开始标记之间。例example3_18.xml3.6内部DTDXML文件同时内部和外部DTD文件,解析器会合二为一,但内外文件不能同时限制某个标记,不能使用多个元素声明限制同一个标记.同时使用内部DTD和外部DTD<!DOCTYPE根标记名字SYSTEM“外部DTD的URI”[内部DTD]>或<!DOCTYPE根标记名字PUBLIC“正式公用标识符”“外部DTD的URI”[内部DTD]>例3-19example3_19.xmlnineteen.dtdexample3_19_1.xml3.7IGNORE和INCLUDEIGNORE:忽略DTD中某些约束条件INCLUDE:包含某些约束条件<![IGNORE[DTD中某些约束条件]]><![INCLUDE[DTD中的某些约束条件]]>3.7IGNORE和INCLUDE<!ELEMENT学生(姓名,性别,出生年月)>应用<![IGNORE[<!ELEMENT学生(姓名,性别,出生年月)>]]><![INCLUDE[<!ELEMENT学生(出生年月,姓名,性别)>]]>例3_20twenty.dtd
example3_20.xml3.8命名空间
XML允许用户根据实际应用的需要,定义各种各样的标记、元素、实体等来描述数据。那么两个不同的XML文档使用同一个名字来描述不同类型的元素的情况就可能发生。而这种情况又往往会导致在将多个XML文档的数据集成在一个文档中时发生的命名冲突问题。【例1】在一个计算机公司的业务数据中,既包含公司的联系信息,又包含一些客户的订货信息。公司的联系信息和客户订货信息有些数据项相同,但有些不同,因此我们分别定义了如下两个DTD来描述公司的联系信息和客户订货信息:命名冲突的解决办法:为了解决当一个XML文档包含多个DTD中定义的元素时出现的元素重名问题,W3C的XML小组制定了被称为命名空间(NameSpace)的标准。W3C组织于1998年2月提出命名空间标准的第一个草案,1999年1月14日正式发布为推荐标准,标准提供了一个称之为前缀标识法的解决方法。所谓的前缀标识法就是在元素名和属性名前面增加一个标识,该标识代表了一个指向某个命名空间的URL地址,以唯一区分当前元素或属性来自哪一个DTD。1.声明命名空间
命名空间是由xmlns属性来声明的,该属性可根据需要,放在任何元素标记中,其基本格式是:
xmlns=“URI”或:
xmlns:前缀标识=“URI”其中:xmlns是保留关键字;URI唯一地定义了一个正在使用的命名空间,它经常是一个指向DTD的URL。声明位置既可以在XML文档开始处,也可以是使用该前缀的起始元素的标记处,或引用处的父元素标记处。命名空间的作用范围包括声明它的元素和该元素的所有子元素,除非被其它命名空间声明所覆盖。2.使用命名空间
引入了命名空间后,一个合法的元素名和属性名的形式是:
前缀标识:元素名
和
前缀标识:属性名
其中:前缀标识必须是一个已经声明过的命名空间的前缀标识,语法分析器将把它与命名空间声明中的URI引用相关联;元素名和属性名分别是在文档类型定义中定义的元素名称和属性的名称。【例2】下列订货单XML文档引用了例1的两个dtd文件:
<订货单xmlns:客户="客户订货信息.dtd">
<客户:订单>
<客户:订单号>0001</客户:订单号>
<客户:产品编码>P.04</客户:产品编码>
<客户:客户联系信息>
<客户:姓名>张三</客户:姓名>
<客户:电话>05952688888</客户:电话>
<客户:email>zhang@</客户:email>
</客户联系信息>
</客户:订单>
<客户:订单>
<客户:订单号>0002</客户:订单号>
<客户:产品编码>P.05</客户:产品编码>
<客户:客户联系信息>
<客户:姓名>李四</客户:姓名>
<客户:电话>05952699999</客户:电话>
<客户:email>li@</客户:email>
</客户:客户联系信息>
</客户:订单>
<公司:公司联系信息xmlns:公司="公司联系信息.dtd">
<公司:公司名称>创新计算机公司</公司:公司名称>
<公司:联系人姓名>王五</公司:联系人姓名>
<公司:电话>059526777777</公司:电话>
<公司:email>wang@</公司:email>
</公司:公司联系信息></订货单>对于缺省方式声明的命名空间,其作用域内无前缀的元素和属性均被看作是该命名的空间的元素和属性。【例2】下列订货单XML文档与例1的订货单文档等同。<订货单xmlns="客户订货信息.dtd"><订单><订单号>0001</订单号><产品编码>P.04</产品编码><客户联系信息><姓名>张三</姓名><电话>05952688888</电话><email>zhang@</
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省2026年成人高考艺术概论练习题及答案
- 防城港市注册测绘师资格考试(测绘综合能力)题库及答案(2026年)
- 2026年重庆市风景园林职称(风景园林工程与技术)综合试题及答案
- 2026年上半年湛江全国英语等级考试(PETS)一级B全真模拟试题及答案解析
- 2026年卫生高级职称面审答辩(放射医学技术)在线题库及答案(正高面审)
- 2026年中级经济师试题人力资源管理专业知识与实务测试题及答案
- 社区卫生服务中心驾驶员装卸作业安全操作规程
- 有限空间作业单位安全管理员定期维护安全操作规程
- 延安中考政治试题及答案
- 2025年7月公共营养师基础知识测试题+答案
- SYT 5074-2025《钻井和修井动力钳、吊钳》
- 江苏南京市秦淮区2025-2026学年八年级下学期英语期末试卷
- 济南市章丘市2026届三年级数学第二学期期末学业水平测试试题(含答案解析)
- 餐饮行业订餐合同规范模板
- 眼镜制造工程师考试试卷及答案
- 2026学年四川省宜宾市六年级数学期末模考快速提分题详细参考解析详细答案和解析
- 河道挡墙钢板桩围堰施工方案
- 2026年教育系统学校中层后备干部选拔考试题(含答案)
- 医院临床路径管理实施及考核评价细则
- 23J916-1:住宅排气道(一)
- 生态治理技术课件
评论
0/150
提交评论