第十二课 XML操作 主讲:刘杨
本章知识点和教学要求 熟悉和了解SML 了解XML基础知识 了解如何使用DOM接口读写XML 了解如何使用SAX接口读写XML
一、XML概述 XML(extensible markup language,可扩展的标记语言)是一套定义语义的标记规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是一种元标记语言,即定义了用于定义其他与特定领域有关的,语义的,结构化的标记语言的句法语言。XML也是一套标记语言,可以扩展,由用户自行定义规则。 XML只描述结构和语义,并不说明数据在浏览器中显示的格式,如果要把XML的内容展示在浏览器中,可结合XSL来实现。
二、XML基础知识 2.1 如何编写XML文档 XML具有良好的可读性,但编写XML文档也有严格的标准,主要有如下的编写规则: 1)标签要配套,有开始必有结束。如<table>…</table>或<table/> 2)标签区分大小写 3)标签可以嵌套,但必须合理。如<user><username>…</username></user>
2.1 如何编写XML文档(续) 4)标签的属性必须以双引号或单引号括起来,即便是数字类型也需要用括起来。 如:<use username = ‘刘杨’> 5)XML文件中只能有一个根元素。根元素是指XML文件中的第一个标签对。 编写XML文件使用普通的文本编辑器即可,如Windows下的记事本,但推荐使用专门的编写工具,如XMLSpy。
2.2 XML文档的结构 XML文档由XML声明、元素、注释、处理命令5部分组成。 1)XML声明 说明:“[”与“]”之间的是可选项。
1)XML声明(续) 注意:XML声明必须位于XML文档的第一行,且前面不能有任何字符;XML声明必须以”<?”开头,以”?>”结尾。 XML的版本号在本书中均使用1.0标准,字符编码方式默认为UTF-8,如果文档中有中文,可使用gb2312。Standalone为yes则表明XML文档是独立的,否则表明XML文档依赖于外部分档。如:
2)文档类型声明 文档类型声明用于定义XML文档中元素和元素的悟性的规则及它们之间的相互关系。这些声明语句也可写在专门的DTD文件存放这些声明,文件的扩展名为.dtd,写在XML文档中的实例如下: 写在DTD文件中的实例如下:
3)注释 注释以<!--开头,-->结尾,XML处理器将忽略注释。注释不能位于XML声明之前,也不能位于标签之中,并且‘--’符号不能出现在注释之中,不允许以-->结尾。
4)元素 元素由元素名称、元素属性和元素内容组成。元素属性实质上就是一个键值对。元素名称需遵循如下的命名规范。 不能是“x”、“m”、“l”这3个字母的大写或小写按顺序组合,如不能是“xml”、“XML”、“Xml”。 只能以字母,下划线,冒号开头 中间不能有空格 如:
4)元素(续) 元素内容中不能有这些字符:<,&,]]>。]]>是CDATA段结束的定界符。另外两个可以用引用来实现。引用的方法是用"&#"后跟数字代码表示或使用预定义实体引用,并以分号结束,详见表11-1所示。 字符 用十进制代码引用字符 用十六进制代码引用字符 预定义实体引用 < < < > > > " " " " ' ' ' ' & & & &
4)元素(续) CDATA段表示这个段中包含的内容时是纯字符数据,而非XML标签。一种典型的情形是XML文档中某个元素的内容是一段程序代码,程序代码中可能含有“<”,就可用CDATA端。如下所示:
5)处理指令 处理指令用于说明XML文档中由应用程序来处理的指令,它的声明方法与XML声明类似,实例如下: xml -stylesheet处理指令需位于XML声明之后,第一个XML元素之前,其他处理指令位置不受限制。
2.3 DTD 为保证XML文档结构的完整性以及元素之间的关系的正确性,可使用DTD。可以把DTD理解成为编写XML文档而约定的一套语法规则。 在XML文件中引入DTD的方法如上节中的文档类型声明,引入的方式有两种:内部DTD和外部DTD。
2.3 DTD(续) 1)使用外部DTD 在XML文档中声明文档类型时,可用SYSTEM或PUBLIC关键字来指出外部DTD文件所在位置,格式如下: <!DOCTYPE greeting SYSTEM|PUBLIC "DTD文件路径"> SYSTEM关键字表示XML文档使用的DTD是私有的,PUBLIC关键字表XML文档的DTD是公用的。DTD文件路径可使用相对路径,也可使用绝对路径。如果直接写的DTD文件名,没有路径,则表示DTD文件与当前XML文档位于同一目录中。
2)DTD的结构 DTD由元素类型声明、属性表声明、实体声明、记号声明组成,用于定义XML文件档中的元素结构、属性类型、实体引用。 元素类型声明 元素类型声明用于描述XML文档根元素、文档的内容和结构。元素可以为空,也可以是字符数据,还可以有若干个子元素。子元素也可以有其自己的子元素,因此就存在父子关系。DTD就可以用来描述这种关系,声明元素的类型格式如下: <!ELEMENT 元素名称 元素内容声明>
2)DTD的结构(续) 看一个实例: 上面的语句表示元素name等都是#PACDATA类型,该类型的含义是字符数据,表明这个元素不能包含子元素。如果声明元素的语句是DTD中第一句声明元素的语句,则这个元素是XML文档的根元素。
上面的语句表示student元素有三个子元素,且这三个元素必须严格按照顺序出现在XML文档中。如果父元素必须由两个子元素的一个,就用“|”符号,比如这里的telephone|handset。如果表示父元素的某个子元素至少出现一次,可用“+”符号 ,比如这里的name;如果表示某个元素可出现多次用“*”代替;如果表示某个元素出现0次或1次,可用“?”代替。
元素也可以定义为混合类型,混合类型表示元素可以是混合类型,混合类型表示元素可以是#PCDATA,且#PCDATA必须为第一个,如: 声明元素为空使用EMPTY,声明元素内容可以为任意字符数据或子元素使用ANY。如:
实体声明 实体可用来表示需要重复使用的数据。实体有两种类型:一般实体和参数实体。一般实体是指在文档内容中使用的实体;参数实体是指在DTD中使用的已分析实体。声明实体用ENTITY关键字。 一般实体声明格式如下: <!ELEMENT 实体名称 “实体内容”> 在XML文档中引用实体方式为:&实体名 参数实体声明格式如下: <!ENTITY %实体名 “实体内容”> 引用实体的方式是:%实体名;。但参数实体只能在DTD中被引用。
实体声明(续) 一个完整的实例如下: 首先一个.dtd文件如下:
实体声明(续) 其次一个.xml文件如下:
实体声明(续) 将xml文件以浏览器方式打开,其运行结果为:
属性表声明 属性其实就是元素中的键值对,只能在空元素和元素开始部分出现。通过属性表声明可定义元素的属性名称、数据类型和默认值。属性表声明的格式如下: <!ATTLIST 元素名 属性名 属性类型 默认声明> 默认声明用于说明元素中该属性是否必须出现,如果不是又该如何处理。它有4种设置: #REQUIRED: 表示元素必须提供该属性 #IMPLIED : 该属性是可选的,可有可无 #FIXED 默认值:表示该属性的值不能被修改 默认值:表示该属性的值是可以改变的,如果没有设置,则其值为默认值。
在属性表声明中,属性类型有10种:CDATA、Enumerated、ID、EDREF、IDREFS、ENTITY、ENTITIES、NMTOKEN、 NMTOKENS和NOTATION。
ID:此类型的属性用于唯一标识元素,其属性值中不能出现空格,一个元素只能有一个ID属性。且ID属性必须设置为#IMPLIED或#REQUIRED。如: NMTOKEN :表示属性的类型为名称标记。名称标记不同于XML名称,XML名称不能以除字母、下划线和冒号之外的其他字符开头,而名称标记可以,不过名称标记中也不能有空格。NMTOKENS表示可以有多个值,在XML文档中使用时,止于至之间用空格分开。
IDREF:该类型用于表示元素之间的关联关系,即一个元素中的属性值是本XML文档中另一个元素的属性值,且必须是已存在的。如: 以上语句中student元素由一个属性class_id表示学生所在的班级的ID号,其值必须是在同一XML文档中的class元素中已有的。 如果一个属性需要引用XML文档中多个ID类型的属性值,可声明为IDREF类型。多个值之间用空格分开。
ENTITY:该类型的属性把外部的二进制数据连接到文档中。ENTITY的属性值是在DTD中声明的、未分析的一般实体的名称。如下面一个完整的实例:
其次是xml文件内容如下: 该实例表示student元素由一个属性stu_image,为ENTITY类型。声明了一个实体mypic与图片http://www.yhkjw.net/img/logo.jpg相关联。NDATA表示该实体是一般的未分析的实体。
ENTITIES:如果声明元素时为此类型,则XML文档中该属性可以有多个实体值,值与值之间用空格分隔。 NOTATION:用作记号声明,以指定一个外部程序关联。
小结 关于XML的基础知识就讲到这里,下一讲将讲述用DOM和SAX读写XML的相关知识。
谢 谢 !