




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XML程序设计(一)教材:可扩展标记语言(XML)出版:NIIT参考书:吴洁:XML应用教程(第2版)清华大学出版社,2007第2章使用XML模式
和名称空间1良构的和合法的XML文档一个良构的(Well-Formed)XMLdocument:包含嵌套在其他元素中的元素有唯一的根元素遵循XML元素命名惯例遵循XML属性引用规则所有特殊字符被正确回避一个合法(有效)的(Valid)
XMLdocument有一个附带的词汇集并遵循该词汇集中指定的结构规则。附带的词汇集或是
DTD或是XMLSchema.
2良构的(Well-Formed)XML
有可选的首行;如编码非UTF-8则必须出现.<?xmlversion="1.0"?>首位标记匹配出现,语法正确.<tag>data</tag>属性定义于开始标记内并被正确地引号括起来.<tagattribute="x">data</tag>元素嵌套正确.<employee> <name>JohnSmith</name> <id>X04913</id></employee>这些是XML文档结构的简单限制.
32.1XML文档类型定义DTD为何需要DTD?如果我们需要额外的限制:<messageurgent="yes"> <greeting>hi</greeting> <farewell>bye</farewell></message>只能有两个特定的子女('greeting','farewell').子女greeting必须先于子女farewell.Message可以由一个可选的属性urgent.如果想定义和发布一个XML文档必须遵守的结构如果希望计算机能够验证某个XML文档符合这些限制如果想在两个XML文档之间重用文本片断5DTD是什么?文档结构的蓝图.包含一系列声明.DTDs可以是独立于XML文档的文件.也可以嵌入XML文件.可以用一个独立文件和XML文件分离.DTDs定义了:可以或必须出现的元素.元素出现的频率.元素嵌套情况.允许的,必须的和缺省的属性.注意:DTD的使用是可选的.符合DTD中规则的XML文档被称为“有效的”(“valid“)6XML与DTD例子<?xmlversion='1.0'?><address><name><title>Mrs.</title><first-name>Mary</first-name><last-name>McGoon</last-name></name><street>1401MainStreet</street><city>Sheboygan</city><state>WI</state><zip>38472</zip><country>USA</country></address>7<!ELEMENTaddress(name,street*,city,state,zip?,country)><!ELEMENTname(title?,first-name,last-name)><!ELEMENTtitle(#PCDATA)><!ELEMENTfirst-name(#PCDATA)><!ELEMENTlast-name(#PCDATA)><!ELEMENTstreet(#PCDATA)><!ELEMENTcity(#PCDATA)><!ELEMENTstate(#PCDATA)><!ELEMENTzip(#PCDATA)>DTD定义方法DTD定义方法:<!DOCTYPE根元素[DTD内容]>带DTD的XML文件实例(注:两边是一个完整的文件)8<?xmlversion="1.0"?>
<!DOCTYPEnote[
<!ELEMENTnote(to,from,heading,body)>
<!ELEMENTto(#PCDATA)>
<!ELEMENTfrom(#PCDATA)>
<!ELEMENTheading(#PCDATA)>
<!ELEMENTbody(#PCDATA)>
]><note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don'tforgetmethisweekend</body></note>元素声明元素声明的语法:<!ELEMENTelementName(contentModel)>DTD中的元素声明和XML文档中相应的元素:例:声明(DTD):<!ELEMENTgreeting(#PCDATA)>有效的XML片断:<greeting>Hello,World!</greeting><greeting> <![CDATA[HelloBEAUTIFUL!)]]></greeting>9元素内容模型元素的内容被描述为内容模型.DTD内容模型的类型<!ELEMENT元素名称类型>EMPTYANYElements(包含子元素)Mixed10空内容模型元素没有数据.可能有属性.声明(DTD):<!ELEMENTplaceholderEMPTY>例:有效的XML:<placeholder></placeholder>或<placeholder/>(更符合习惯)11Any内容模型可包含任何数据或well-formedXML.使用的元素必须在DTD中声明声明(DTD):<!ELEMENTuniverseANY><!ELEMENTgalaxy(#PCDATA)>例:有效的XML片断:<universe></universe><universe>thewholeuniverse</universe><universe> <galaxy>galaxy1</galaxy> </universe>12元素内容模型元素内容模型由内容模型粒子指定内容模型粒子或是元素名或下表中的一项.<!ELEMENTname(childparticles)>13例:元素内容模型(1/3)例:声明:<!ELEMENTperson((fname,lname)|(lname,fname))><!ELEMENTfname(#PCDATA)><!ELEMENTlname(#PCDATA)>有效的XML:<person> <fname/> <lname>Smith</lname></person><person> <lname>Smith</lname> <fname>John</fname></person>14例:元素内容模型(2/3)例:声明:<!ELEMENTorder(order-item+,delivery-address,order-date?)><!--Childelementsdefinedascontaining#PCDATA-->有效的XML片断:<order> <order-item/> <delivery-address/></order><order> <order-item>item3<order-item/> <order-item>item4<order-item/> <delivery-address/></order><order> <order-item>item5<order-item/> <order-item>item6<order-item/> <delivery-address/> <order-date>July5,2001</order-date><order/>15例:元素内容模型(3/3)例:声明:<!ELEMENTphonebook(entry|column-heading|number)+><!--entryandcolumn-headingcontain#PCDATA,numberisEMPTY-->有效的XML片断:<phonebook><entry/><entry/><entry/></phonebook><phonebook> <column-heading/><column-heading/></phonebook>无效的XML:<phonebook> <column-heading> <number> <entry>entry1</entry> </number> </column-heading></phonebook>16例:混合内容模型例:声明:<!ELEMENTdescription(#PCDATA)><!ELEMENTreview(#PCDATA|product)*>有效的XML片断:<description> descriptivetextgoeshere</description><review> Thisisareviewofthe <product> car </product> thatgoesonforpagesofregulartext.</review>17属性声明属性列表声明用于声明一个元素的属性语法:<!ATTLIST元素名称属性名称属性类型默认值><!ATTLISTelementNameattributeNameattributeTypeattributeDefault ... attributeNameattributeTypeattributeDefault>18属性值处理处理属性时,XML处理器执行下列两步:属性值规范化把所有实体引用用他们的替代文本替换.替换所有空格、tab、回车和换行符为空格.“白空格压缩"舍弃所有前导和尾随空格.将所有空格序列替换为单个空格.19属性类型20属性的默认值(缺省值)21ID属性语法:<!ATTLISTelementNameattributeNameID
attributeDefault>声明:<!ELEMENTemployee(#PCDATA)> <!ATTLISTemployeeserialNumberID#REQUIRED>例:有效的XML片断:<employeeserialNumber="e00001">JoeSmith</employee> <employeeserialNumber="e00002">BillSmith</employee> <employeeserialNumber="e00003">JohnSmith</employee>无效的XML片断:<employeeserialNumber="e00001">JoeSmith</employee> <employeeserialNumber="e00001">JohnSmith</employee>22枚举属性语法:<!ATTLISTelementNameattributeName(eval|eval|..) attributeDefault>声明:<!ELEMENTshirt(#PCDATA)> <!ATTLISTshirtsize(small|medium|large)#REQUIRED>有效的XML:<shirtsize="small">plaidpolyester</shirt> <shirtsize="large">whitepoplin</shirt>无效的XML:<shirtsize=“XXL”>navypullover</shirt>23属性默认值(缺省)的例子声明:<!ELEMENTshirt(#PCDATA)> <!ATTLISTshirtsize(small|medium|large)"large"> <!ATTLISTshirttypeCDATA#REQUIRED> <!ATTLISTshirtmanufacturerCDATA#FIXED"Levi">例:有效XML:<shirttype="short">cotton</shirt> <shirttype="short"size="large">wool</shirt> <shirttype="short"manufacturer="Levi">denim</shirt>无效XML:<shirt></shirt> <shirttype="short"size="mediumlarge">cardigan</shirt> <shirttype="short"manufacturer="Gap">designer</shirt>24DTD中属性定义例子例:声明:<!ELEMENTbook(#PCDATA)> <!ATTLISTbook idID#IMPLIED isbnCDATA#REQUIRED booktype(Hardcover|Paperback)"Paperback" storelocCDATA"5thAvenue“ yearCDATA#FIXED"2000" commentCDATA#IMPLIED >有效XML:<bookisbn="1-56592-709-5"storeloc="TimesSquare">XMLPocketReference</book>25实体(Entity)实体就像宏或常量.<!ENTITYentityName"replacementText">使用实体,将一个实体名的引用放到XML文档中.实体名的引用代替替换文本.实体可以在文件内部定义,也可以使用一个URI外部定义.26声明普通实体普通实体用在XML文档中.语法:<!ENTITYentityName"replacementText">例:声明:<!ENTITYprod17792"ACME2000InteractiveCalendar">有效XML:<response>Thankyouforchoosing&prod17792;asyourprimaryschedulingprogram.</response>处理后的XML:ThankyouforchoosingACME2000InteractiveCalendarasyourprimaryschedulingprogram.27声明外部实体语法:<!ENTITYentityNameSYSTEM"URI">例:声明:<!ENTITYprod17792SYSTEM"prod17792.ent">在文件prod17792.ent中:<?xmlversion="1.0"encoding='UTF-8'> ACME2000InteractiveCalendar有效XML:<response>Thankyouforchoosing&prod17792;asyourprimaryschedulingprogram.</response>处理后的XML:ThankyouforchoosingACME2000InteractiveCalendarasyourprimaryschedulingprogram.28内建实体XML中的五个内建字符实体:字符引用:允许用数字引用到Unicode字符:nnn;(nnnisdecimal)例: =spacennn;(nnnishexadecimal)例: =space29参数实体参数实体用于DTD.用于重用一个属性列表的部分或一个复杂内容模型说明的部分.语法:<!ENTITY%parameterEntityName“replacementText”>引用该参数实体:%parameterEntityName;30参数实体例子<!ENTITY%commonAtts typeIDID#REQUIRED makeCDATA#IMPLIED modelCDATA#IMPLIED> <!ELEMENTcar(#PCDATA)> <!ATTLISTcar%commonAtts;> <!ELEMENTcomputer(#PCDATA)> <!ATTLISTcomputer%commonAtts;> <!ELEMENTphone(#PCDATA)> <!ATTLISTphone%commonAtts; type(rotary|digital)#IMPLIED>31DTD中的注释语法:<!--commentTextHere-->例子:<!--Thisisacomment-->使用注释对元素和属性进行清晰的语义说明,可以帮助他人定义符合该DTD的XML文档.32外部DTDDTD与XML在分离的文件中:例:文件:hello.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmessageSYSTEM"message.dtd"><message> <greeting>Hello,World!</greeting> <farewell>Goodbye,World!</farewell></message>文件:message.dtd<?xmlversion="1.0"encoding="US-ASCII"?><!ELEMENTmessage(greeting,farewell)><!ELEMENTgreeting(#PCDATA)><!ELEMENTfarewell(#PCDATA)>33DTD的缺点没有类型支持.#PCDATA可以是任意的字符串(标记除外)DTD语法不同于XML语法.<!ELEMENTzip(#PCDATA)>有些限制,DTDs不能容易的表达:元素x可以出现4到17次如果元素y的类型是“decimal”,元素y必须包含元素x.XMLSchema解决了许多DTDs的限制.XMLSchema现在是W3C推荐标准.对W3CSchema的支持是新的.包含下列特征:XML语法,强大的类型定义,约束。342.2XML模式(Schema)Schema与DTDDTD的限制:语法限制两套不兼容的解析器有限的数据类型不支持名称空间Schema:XMLSchema是XML文档使用名称空间更多更细的类型数据36DTD与XMLSchema对比以正整数的说明为例.DTD说明一个数据量为:<!ELEMENTquantity(#PCDATA)>这个说明允许用任意字符数据量表示。在schema中,数值量可以说明如下:<xsd:schemaxmlns:xsd='/2001/XMLSchema'><xsd:elementname='quantity'type="xsd:nonNegativeInteger"/><xsd:/schema>例:在XML中,下面的说明都是有效的:<quantity>4</quantity>只有在XMLschema中才能发现下面的XML是无效的:<quantity>-5</quantity><quantity>lots</quantity>37XMLSchema类型简单类型:仅封装了数字、字符串等简单数据,不包含任何子元素的元素,可以自定义,如电话号码,是4位数字-8位数字复杂类型:封装了子元素或属性的元素3839简单类型例子例:Schema声明: <xs:schema xmlns:xs='/2001/XMLSchema'> <xs:elementname='quantity' type="xs:nonNegativeInteger"/> <xs:/schema>有效XML片断:<quantity>4</quantity>无效XML片断:<quantity>-5</quantity><quantity>lots</quantity>nonNegativeInteger是一种内建简单类型.40空元素空元素:既不允许有字符数据也不允许有子元素,但可以有属性值,复杂类型定义中没有特殊属性来表明内容为空,只给复杂类型指定了属性,而没有指定内容模型,就说明是空元素了。<xs:complexTypename="sizetype"> <xs:attributename="system"type="xs:string"/></xs:complexType>41简单元素说明当类型定义存在时,用下列定义格式(内建的或其它)定义。下面是一个预定义类型的元素说明,精确地说明了出现次数。
<xsd:elementname='quantity'type='xsd:nonNegativeInteger'minOccurs='1'maxOccurs='1'/>minOccurs和maxOccurs用于指出元素要求或允许出现的次数。注意:如果类型名不与schema的缺省命名空间联系,类型名必须用命名空间限定。42minOccurs和maxOccurs属性minOccurs属性指定组件出现的最小次数。maxOccurs属性指定组件出现的最大次数。可以有
minOccurs或
maxOccurs属性的组件有:Elements.Groups.xsd:all,xsd:sequence和xsd:choicecompositors.Wildcards.两者的缺省值均为1.如果minOccurs大于maxOccurs为错误maxOccurs可以用
unbounded表示无限。43例:minOccurs和maxOccurs属性<xsd:elementname='DNASample'><xsd:complexType><xsd:sequence><xsd:elementname='sample'type='dnaType’ minOccurs=‘2’maxOccurs=‘5'/></xsd:sequence></xsd:complexType></xsd:element>...有效的XML:<DNASample><sample>GATCTATC</sample><sample>ATAAACG</sample></DNASample>无效的XML:<DNASample><sample>ATGCAAT</sample></DNASample>44属性在XML模式中,你可以采用与声明元素相同的方式来声明属性。在XML模式中声明属性可方便XML文档的信息同化。
属性声明可以两种方式定义:简单类型定义:可方便属性信息的局部验证。全局属性声明:允许再使用属性。45声明属性在XML模式定义(XSD)中,使用attribute元素声明用户定义元素的属性。
在XSD中声明属性的句式如下所示:<attributename="attributename" ref="attributename" type="datatypename" use="value" value="value"></attribute>attribute元素包含用以进一步限制和约束用户定义属性的作用域和用法的属性。46attribute
元素attribute
元素包含以下属性:namereftypeuse47attribute
元素的属性attribute
元素的属性:name用来指定用户自定义属性的名称。当模式元素是attribute元素的母元素时,必须使用这个属性。
name属性的值不能包含冒号(:)。name和ref属性不能同时出现。48例:name
<xs:attributename="code"><xs:simpleType> <xs:restrictionbase="xs:string"><xs:patternvalue="[A-Z][A-Z]"/></xs:restriction></xs:simpleType></xs:attribute>例子指示"code"属性有一个限定。唯一可接受的值是大写字母A到Z中的两个字母。49attribute
元素的属性attribute
元素的属性:ref用来引用在相同或其他任一XSD文档中声明的一个用户定义属性。如需使用在复杂类型中一个已有的属性定义来声明一个属性,使用ref属性。name和ref属性不能同时出现。50例:ref如需在复杂类型中使用一个已有的属性定义来声明一个属性,使用ref属性。
<xs:attributename="code"><xs:simpleType><xs:restrictionbase="xs:string"><xs:patternvalue="[A-Z][A-Z]"/></xs:restriction></xs:simpleType></xs:attribute><xs:complexTypename="someComplexType"><xs:attributeref="code"/></xs:complexType>51attribute
元素的属性attribute
元素的属性:type
type属性的值指定用户定义属性的数据类型。52例:type
<xs:attributename="lang"type="xs:string"default="EN"/>属性既可以拥有默认值,也可以拥有指定的固定值。在没有其他的值被指定时,会自动向属性赋予默认值。在上面的例子中,默认值是“EN”。在下面的例子中,固定值是“EN”。
<xs:attributename="lang" type="xs:string"fixed="EN"/>53attribute
元素的属性attribute
元素的属性:use规定如何使用该属性。可设置下面的值:
optional-属性是可选的并且可以具有任何值(默认)。prohibited-不能使用属性。required-属性是必需的。54例:use所有属性默认都是可选的。如需明确地规定属性为可选,使用"use"属性optional: <xs:attributename="lang"type="xs:string"use="optional"/>Required使属性成为必需的属性:<xs:attributename="lang"type="xs:string"use="required"/>55例:属性说明<xsd:elementname='blank'><xsd:complexType><xsd:attributename='temperature' type='xsd:decimal'fixed='32.0'/></xsd:complexType></xsd:element>有效的XML:<blanktemperature='32.0'/><blank/><!--temperature='32.0'-->无效的XML:<blanktemperature='34.0'/>56全局属性全局属性声明是schema文档的顶级结构中,也就是说,它的父元素是schema,那么这些属性为全局属性,在模式文档中必须是唯一的。利用attribute标记符的ref属性来引用。局部属性声明只出现在复杂元素定义中,它们仅能在该元素定义中使用,而不能被其他元素重用。全局属性可方便属性的再使用。全局属性可与简单和复杂数据类型相关联。全局属性可作为父元素的模式元素。57全局属性的例子
<xsd:schemaxmlns:xsd="/2001/XMLSchema">
<xsd:attributename="isbn"type="xsd:string"/>
<xsd:attributename="amount"type="xsd:integer"/>
<xsd:elementname="book">
<xsd:complexType>
<xsd:elementname="price"type="xsd:integer"/>
<xsd:attributeref="isbn"use="required"/>
<xsd:attributeref="amount"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>两个属性——isbn和amount的全局声明,元素book为一个复杂类型,使用ref引用这两个全局属性。58限制(Facets)Facets表述一个简单类型的值域或词汇空间值域–从该类型中抽取部分值.词汇空间–可以写的具体词汇集为了对可指派给一个属性的值施加限制:声明该属性并使它与一个用户定义简单数据类型相关联。使用XSDsimpleType元素来创建一个简单数据类型。
在simpleType元素内使用XSDrestriction元素,以对可指派给使用简单数据类型的元素或属性的值施加限制。59限制(Facets)60限制Facets界限界限(只能应用于时间和数字类型)minExclusive:值必须大于xminInclusive:值必须大于等于xmaxExclusive:值必须小于xmaxInclusive:值必须小于等于x61限制Facets例子声明:<xs:schemaxmlns:xs:'/2001/XMLSchema'><xs:simpleTypename='quantityType'><xs:restrictionbase='xs:integer'><xs:minInclusivevalue='2'/><xs:maxInclusivevalue='5'/></xs:restriction></xs:simpleType><xs:elementname='quantity'type='quantityType'/></xs:schema>有效的XML片断:<quantity>4</quantity>无效的XML片断:<quantity>-6</quantity><quantity>many</quantity>62限制Facet枚举<schemaxmlns='/2001/XMLSchema'><elementname='color'><simpleType><restrictionbase='string'> <enumerationvalue='red'/> <enumerationvalue='green'/> <enumerationvalue='blue'/></restriction></simpleType></element></schema>有效XML:<color>red</color>无效XML:<color>mauve</color><color>10</color>63活动:创建一个XML模式问题描述:CyberShoppe的市场经理将公司的产品信息从总公司发送到了分公司。按照常规,分公司更新这个文件并将它发送回总公司。在所有分公司中,必须采用一致的格式存储产品的详细信息。必须对可保存在数据存储器中的数据类型施加限制,以确保信息的一致性。
CyberShoppe销售两种类别的产品:书籍和玩具。产品的详细信息包括产品名称、简要描述、产品价格以及现有可用数量。产品价格必须始终大于零。除了这些详细信息之外,资料存储器需要存储类别和产品ID。见教材相关部分(第二章P.2.25)独立完成各项任务642.3名称空间(命名空间)XML的名称空间XML最大的特点就是其扩展性,它允许用户自己定义适合自己的标记,这个特点给了用户非常大的自由空间,但同时也出现了标记名称可能重复的问题。对于相同名称的标记,解析器在解析的时候就很难分辨。为了区分这些标记,W3C制定了名称空间的机制,即在标记或属性名字前面加上这个标记归属。通过这样的方法,就能够轻松区分相同名字的标记或属性。6667为什么需要名称空间?考察下面的XML文档:<catalogEntry> <book>
<title>thisbook</title><isbn>0001</isbn><author>
<title>Dr.</title><lastName>Expert</lastName><firstName>Iman</firstName></author></book></catalogEntry>一个应用如何知道:第一个title是书名,而第二个title是人名.名称空间在XML中,名称空间是统一资源标识符(URI)指派或可识
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 饭店小额入股协议书
- 饭店招聘厨师协议书
- 酒吧卡座外包协议书
- 2025年员工培训计划全攻略
- 农家乐入股合同协议书
- 项目文明施工协议书
- 养老院老人退养协议书
- 判决书双方协商协议书
- 酒店转让居间协议书
- 设备临时使用协议书
- 2025年商法知识竞赛考试试卷及答案
- 2025年山东省临沂市平邑县中考一模语文试题(含答案)
- 2025年电子信息工程专业考试试题及答案
- 【威海】2025年山东省威海技师学院公开招聘工作人员29人笔试历年典型考题及考点剖析附带答案详解
- 2025年第六届全国国家版图知识竞赛题库及答案
- 机械租赁投标服务方案
- 2025年北京市朝阳区九年级初三一模英语试卷(含答案)
- Unit1-Unit2重点短语(背诵版+默写版)外研版英语新七年级下册
- 《抗休克药物治疗》课件
- 《2024 3572-T-424 重大活动食品安全保障规范 第 3 部分:供餐》知识培训
- 2025年中考语文总复习:八年级下册教材字词打卡练
评论
0/150
提交评论