刘春武汉理工大学计算机学院2.1XML文档的结构2.2元素2.3属性2.4CDATA段2.5命名空间2.6XML文档的语法规范XML文档属于纯文本文件,XML文档在逻辑上主要由以下五个部分组成:XML声明处理指令文档类型声明注释元素XML声明以“?”开始,“?”结束。“?”后紧跟xml,表明该文件是XML文件。XML声明包含三个部分•指明采用的是XML的哪个版本。“version=1.0”表示该文件遵循的是XML1.0标准。版本声明(必要)•指明此XML文档采用何种编码方式编码声明(可选)•指明该XML文档是否依赖于外部DTD文档独立性声明(可选)?xmlversion=1.0encoding=GB2312standalone=yes?在XML文档中经常会出现与XML必要声明相类似的指令,这也是XML处理程序必须扫描的指令,称为处理指令(ProcessInstrument,PI)。处理指令的格式也是以“?”开始,并以“?”结束。?xmlstylesheettype=text/xslhref=D:\mystyle.xsl?该示例表示用样式表文件mystyle.xsl来显示XML文档,其中type属性用于选择样式,而href属性表示样式表文件的路径DTD称为文档类型定义(DocumentTypeDeclaration),主要用于确定XML文档的合法性。文档类型定义是以!DOCTYPE…的结构在XML文档中出现!DOCTYPE产品信息[!ELEMENT产品信息(产品*)!ELEMENT产品(名称,价格,数量)!ELEMENT名称(#PCDATA)!ELEMENT价格(#PCDATA)!ELEMENT数量(#PCDATA)]注意:XML必要声明、处理指令和DTD声明合起来也称为XML文档头部分。与HTML中的注释一样,XML中的注释也是以“!--”和“--”作为定界符,语法格式为:!--注释内容--元素是XML文档的重要组成部分,元素由开始标签、结束标签和元素内容构成,对于空元素由空元素标签构成。带内容的元素student这是一个学生的信息name李四/nameage18/age/student空元素student/带属性的元素studentname=”李四”age=”18”/studentstudent这是一个学生的信息name李四/nameage18/age/studentXML文档中的第一个元素被称为根元素,在任何一个XML文档中有且只有一个元素被称为根元素。其余所有的元素都是子元素,子元素必须正确的嵌套在根元素中。XML元素的的命名规则:名称可以含字母、数字以及其他的字符名称不能以数字或者标点符号开始名称不能以字符“xml”(或者XML、Xml)开始名称不能包含空格可使用任何名称,没有保留的字词。标签是一对尖括号()和尖括号之间的内容。student这是一个学生的信息name李四/nameage18/age/student元素a的元素名或标签名标记间的字符串数据就是该元素的内容。student这是一个学生的信息name李四/nameage18/age/student元素a的内容在XML中,如果元素的内容中存在空格,那么这些空格将按原样解析出来元素的嵌套指在一个元素内部可以包含其他的元素。XML语法要求元素嵌套要正确,即如果一个元素在另一个元素中开始,那么必须在同一个元素中结束studentname李四/nameage18/age/studentstudentname李四/nameage18/student/ageⅹ√XML元素可以在开始标签中包含属性,类似HTML。属性(Attribute)提供关于元素的额外(附加)信息。studentID=“99101”这是一个学生的信息name李四/nameage18/age/student属性名属性值属性的使用规则:属性的值必须用引号括起来,如:attribute1=“aa”或attribute3=‘aa';元素的属性以名和值成对出现;用来修饰同一个元素的属性的属性名不能相同;属性值不能包含“&”、“’”、“”、“”、“””等字符。在第一个例子中,sex是一个属性。在第二个例子中,sex则是一个子元素。两个例子均可提供相同的信息。XML元素VS.属性personsex=femalefirstnameAnna/firstnamelastnameSmith/lastname/personpersonsexfemale/sexfirstnameAnna/firstnamelastnameSmith/lastname/person避免XML属性?因使用属性而引起的一些问题:属性无法包含多个值(子元素可以)属性无法描述树结构(子元素可以)属性不易扩展(为未来的变化)属性难以阅读和维护请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。personsex=“female”firstname=“Anna”lastname=“Smith”/personⅹ有时候会向元素分配ID引用。这些ID索引可用于标识XML元素。针对元数据的XML属性messagesnoteid=501toGeorge/tofromJohn/fromheadingReminder/headingbodyDon'tforgetthemeeting!/body/notenoteid=502toJohn/tofromGeorge/fromheadingRe:Reminder/headingbodyIwillnot/body/note/messages传递的理念是:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。CDATA指的是不应由XML解析器进行解析的文本数据(UnparsedCharacterData)。CDATA部分由![CDATA[开始,由]]结束script![CDATA[functionmatchwo(a,b){if(ab&&a0)thenreturn1;elsereturn0;}]]/script在XML元素中,和&是非法的。会产生错误,某些文本,比如JavaScript代码,包含大量或&字符。为了避免错误,可以将脚本代码定义为CDATA。命名冲突在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突,XML命名空间提供避免元素命名冲突的方法personnameTomSmith/nametel86541234/teladdresswhut/address/personsupervisornameJackChen/nametelStel86541234/Stelmobile123456789/mobile/tel/supervisor假如这两个XML文档被一起使用,由于两个文档都包含带有不同内容和定义的name和tel元素,就会发生命名冲突。XML解析器无法确定如何处理这类冲突。使用前缀来避免命名冲突命名冲突不存在了,由于两个文档都使用了不同的名称来命名它们的name和tel元素(p:name,m:name和p:tel,m:tel)。但是,通过使用前缀,相当于创建了两种不同类型的name和tel元素。p:personp:nameTomSmith/p:namep:tel86541234/p:telp:addresswhut/p:address/p:personsupervisorm:nameJackChen/m:namem:telm:Stel86541234/m:Stelm:mobile123456789/m:mobile/m:tel/supervisorXML为其麾下所有元素预留了若干特殊属性,命名空间便是用保留属性来进行声明的。通常用“xmlns:”为前缀来声明的属性,就是命名空间的声明命名空间声明有两种方式:•xmlns:命名空间前缀=命名空间名直接定义•xmlns=命名空间名缺省定义是一个合法的XML名称是一个URI引用,其功能是区分不同的命名空间,具有惟一性和持久性。person:personlistxmlns:person=“personlist.dtd”person:personperson:nameTomSmith/person:nameperson:tel86541234/person:telperson:addresswhut/person:address/person:person/person:personlistperson:supervisorxmlns:manager=“manager.dtd”manager:nameJackChen/manager:namemanager:telmanager:Stel86541234/nanager:Stelmanager:mobile123456789/manager:mobile/manager:tel/person:supervisor命名空间前缀命名空间名命名空间并不是一个真实的地址,而只是一个修饰而已引入命名空间以后,元素的合法名称的形式:前缀部分:本地部分要求:①“前缀部分”和“本地部分”都要求是一个合法的XML名称②前缀部分必须是一个已经经过声明的命名空间前缀③本地部分则是在DTD或Schema中定义的元素和属性名manager:nameJackChen/manager:name•使用该前缀的起始元素的标记处•使用处的祖先元素的标记处声明位置•起始元素标记、结束元素标记和空元素标记使用位置命名空间即可以作用于元素,也可以作用于属性。1、命名空间作用于元素personlistxmlns:person=“personlist.dtd”xmlns:manager=“manager.dtd”person:personperson:nameTomSmith/person:name……supervisormanager:nameJackChen/manager:name……/supervisor/person/personlistperson:personlistxmlns:person=“personlist.dtd”person:personperson:nameTomSmith/person:nameperson:tel86541234/person:telperson:addresswhut/person:addressperson:supervisorxmlns:manager=“manager.dtd”manager:nameJackChen/manager:namemanager:telmanager:Stel86541234/nanager:Stelmanager:mobile123456789/manager:mobile/manager:tel/person:supervisor/person:person/person:personlist命名空间”personlist.dtd”作用域是除“supervisor