可扩展置标语言XML(eXtensible Markup Language)是由一系列规则所组成的描述语言,其本质为一种定义语言。任何行业均可遵循这些规则来定义各种标识,对信息中的元素进行描述,然后通过分析程序进行处理,使信息实现“自我描述”。
对于大型的复杂文档,XML更是一种理想语言,其不仅允许指定文档中的词汇,且允许指定元素之间的关系。随着网络的发展,XML在网络开发中的地位已逐渐赶上HTML,很多浏览器已可良好地支持XML,XML正成为一种网络未来发展的主流语言。
一、XML概述
1.什么是XML
从不同的角度分析,XML有不同的解释,具体如下所述:
(1)XML是一种置标语言,置标指开发者可按需自定义任何符合规则的标记,而HTML仅是一种预定义标记语言,只可解析已定义的标记,对于自定义标记则无法解析。
(2)XML是一种语义结构化语言,合理地描述了文件的结构和语义。
(3)XML是一种通用的数据格式,也是一种简单的数据格式,由纯ASCII文本构成,因此抗破坏能力很强。
(4)从高级角度分析,XML是一种自描述语言。
2.XML的常用术语
(1)DTD(Document Type Definition):即文件类型定义。定义的内容包括允许使用的标签、标签元素嵌套的方式及处理方法。XML标准不强制标记设计者使用DTD,但大部分基于XML开发的新语言均带有DTD,使开发者较易编写可理解的标记并编制出巧妙的软件。
(2)XML文件:XML文件由DTD和XML文本组成,简单的XML文本可不包含DTD。
(3)XSL和CSS:XML可定义信息内容,但无法定义信息的表现形式。XML通过XSL(XML Style Language,XML样式语言)和CSS(Cascading Style Sheets,层叠样式表)来实现信息的转换。
(4)XML Schema:虽然DTD限制标记的使用,但对于XML的自动处理仍需更严格和全面的工具,由此出现XML Schema。
(5)DOM(Document Object Model):即文件对象模型。其将XML文件内容转换为一个对象模型,为应用程序提供访问XML文件的接口。
(6)XSLT(XML Stylesheet Language Transformation):即XML样式转换语言。XSLT可从一个已定义的XML文件抽取所需的数据,并组成不同的形式。
(7)Xpointer和Xlinks:Xpointer和Xlinks类似于HTML中的超级链接,用于链接其他XML文件或XML文件中的部分。
(8)XML 框架:XML框架用于控制XML文件结构,是一种高层次的结构控制。
二、XML语法详解
1.XML的文件结构
如前所述,XML允许自定义标记来形象地描述信息,假设需描述一台计算机的基本配置,可自定义一些易于理解的标记,如“computer”、“CPU”等。那么通过使用这些标记,一台计算机的基本配置,用XML描述如下所述:
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
</computer>
上述内容,稍具计算机知识的读者可迅速地理解,也正是XML的优点。当然,标准的XML还需在文件的第一行添加“<?xml version=″1.0″?>”的声明语句,以表示该文件使用的XML版本。XML声明是一种处理指令。完整的XML声明示例如下所述:
<?xml version = ″1.0″ encoding = ″GB2312″ standalone = ″no″?>
在声明中必须包括“version”属性,用于设置所采用的XML版本号,且必须在属性列表中第一个出现。“standalone”属性代表该XML文档是否和一个外部文档类型定义DTD配套使用。“encoding”属性则设置数据所采用的编码标准。
XML文件通常以XML声明开始,通过XML元素来组织数据。XML元素包括标记和字符数据。为使数据组织更方便、清晰,可在字符数据中添加CDATA数据块,并可添加注释。
综上所述,可得XML文件的基本结构,如下所述:
(1)XML文件以XML声明开始。
(2)处理指令以“<?”字符开始,以“?>”结束,“<?”后的第一个单词为处理指令名。
(3)自定义的标记用“<”和“>”字符包含,标记需成对出现,后一个标志需以“</”开始。
(4)XML元素可包含正文和其他元素,但元素必须严格嵌套,即每个起始标记必须有对应的结束标记。
(5)XML元素不能重叠。
XML文件是纯文本文件,可用任何文本编辑器进行编制。如将前述计算机配置的XML文件在文本编辑器中以“xml”扩展名保存后,在5.0版本以上的IE浏览器中浏览,效果如<a href='H:/Data/pic/60090405a.jpg' target=Pic>图</a>1所示:
2.XML文件的元素
XML文件的元素可扩展,彼此之间存在关联,且元素的命名规则非常简单,如下所述:
(1)XML元素可扩展:
XML文件可进行扩展以保存更多的信息,如可为上文介绍的计算机基本配置的XML文件增加显示器内容,只需直接在原XML文件中加入“Monitor”标记即可,如下:
<?xml version = ″1.0″ encoding = ″GB2312″ standalone = ″no″?>
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
<Monitor>PHILIPS 107T</Monitor>
</computer>
(2)XML元素彼此关联:
XML元素之间的关系如同一棵节点组成的树,各节点之间存在“兄弟”或“父子”的概念,在前述的计算机配置XML文件中,“computer”为根元素,“CPU”、“RAM”和“HardDisk”等均为“computer”的子元素。反之,“computer”是“CPU”和“RAM”的父元素。“CPU”和“RAM”之间由于其父元素相同,因此为兄弟元素。
(3)XML元素对大小写敏感:
XML元素对于大小写敏感,因此“<Computer>”和“<computer>”是不同的元素。
(4)空元素的表示:
XML表示空元素非常方便,将一个标签以“/>”符号结尾即表示空元素。
(5)XML元素的保留字符:
由于某些字符为XML语法结构的组成部分,因此如需在XML数据中引用,必须用特殊的字符来代替,这些字符和代替的字符如下表所示:
(<a href='H:/Data/pic/60090405b.jpg' target=Pic>图</a>)
(6)根元素的唯一性:
每个XML文件必须有唯一的根元素,如在上述的计算机配置XML文件中。“computer”为该XML文件的唯一根元素。
(7)元素的内容:
XML元素包含不同的内容类型。一个XML元素由元素起始标记至结束标记之间的全部内容组成。一个元素可包含元素内容、混合内容、简单内容和空内容,还可包含属性。
(8)元素的命名:
XML元素必须遵循的命名规则如下所述:
名字中可包含字母、数字及其他字母(如汉字);名字不能以数字或下划线开头;名字不能以字母“xml”(或XML、Xml等)开头;名字中不能包含空格;名字中不能使用“:”,由于其已为命名空间(namespaces)所保留。
自定义元素名时,有一些技巧可供参考,如下所述:
名字应具有描述性,可通过下划线的方式使名称更形象;名字不易过长;由于XML文件通常和数据库相连接,因此建议将数据库的字段名称和XML文件元素名称相对应;非英文字母在XML元素名称中合法,但取决于解析器是否支持。
3.XML属性
类似于HTML标记,XML元素也可在其起始标记中设计属性,以提供有关元素的附加信息。属性所提供的信息通常非数据的组成部分。
属性值必须包含在引号中,且单、双引号均可使用。如可为计算机配置XML文件的“computer”标记增加一个用户的属性,如下所示:
<computer user=″马前雪″>
在单、双引号中,双引号较常用,但如属性值本身包含引号,则必须使用单引号。
4.CDATA标记
在CDATA标记下,所有的标记或实体引用均被XML解析器忽略,并作为字符数据处理。CDATA标记的语法如下所示:
<![CDATA[
文本内容
]] >
CDATA标记中的文本内容不能出现字符串“]]>”,此外CDATA标记不能嵌套。
如可将计算机配置XML文件的“CPU”标记用“CDATA”标记包括,如下所示:
<![CDATA[
<CPU>P4</CPU>
]]>
5.XML注释
如需进一步增强XML文件的可读性,可添加解释性的字符数据,且希望XML解析器不对这些数据进行处理,该类型的信息称作注释。在XML中注释方法与HTML完全相同,用“<!--”和“-->”将注释文本包含即可。
XML的注释有一些语法规则,如下所述:
(1)注释文本中不能出现“-”字符或“--”字符串。
(2)注释文本不能嵌入标记中,也不能放在标记声明之中或之前。
(3)注释不能被嵌套。
如可为计算机配置XML文件增加注释,如下所示:
<!-- 用XML描述计算机配置 -->
在5.0版本以上的IE浏览器中浏览,效果如<a href='H:/Data/pic/60090405c.jpg' target=Pic>图</a>2所示:
三、XSL概述
1.什么是XSL
XSL(可扩展样式表语言),即XML的样式表。由于XML可按需使用任意标记,因此标记的含义无法被直接解析。鉴于此,浏览器无法获悉如何显示一个XML文件。为显示XML文件,必须通过一个机制来描述显示的方式。XSL是XML的首选样式表语言,其不仅是样式表,且还是转换XML文件、定义XML部分和模式及格式化XML文件的方法。XSL语言的组成部分如下:
XSLT:一种用于转换XML的语言。
XPath:一种用于定义XML部分或模式的语言。
2.XSL转换方法
XSLT是一种将XML文件转换为其他类型文件或XML文件的语言。XPath是一种对XML文件的部分进行寻址的语言。格式化是将XSL转换结果变为适当输出格式的过程。通常XSLT将每个XML元素转换为HTML元素,还可向输出文件中增加或删除一些元素。
在转换过程中,XSLT用XPath定义源文件中与一个或多个预定模板相匹配的部分。当找到一个匹配时,XSLT将源文件中的匹配部分转换为结果文件,源文件中不与任何一个模板匹配的部分在结果中保持不变。
为理解XSL转换的效果,需创建一个结合XSL的XML文件,在后续内容中将以该文件为例进行介绍,其内容如下:
<?xml version=″1.0″?>
<?xml-stylesheet type=″text/xsl″ href=″computer.xsl″?>
<mycomputer>
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
</computer>
<computer>
<CPU>C4</CPU>
<RAM>128M</RAM>
<HardDisk>40G</HardDisk>
</computer>
</mycomputer>
该文件包含二台计算机的配置,因此按前述的XML文件结构,需增加一个唯一的根节点“mycomputer”,最后将该文件以“computer.xml”为文件名保存。
在该文件中,“<?xml-stylesheet type=″text/xsl″ href=″computer.xsl″?>”语句用于关联一个XSL文件,该XSL文件的内容如下所示:
<?xml version=′1.0′?>
<xsl:stylesheet xmlns:xsl=″http://www.w3.org/TR/WD-xsl″>
<xsl:template match=″/″>
<html>
<body>
<table border=″2″>
<tr>
<td>CPU</td>
<td>RAM</td>
<td>HardDisk</td>
</tr>
<xsl:for-each select=″mycomputer/computer″>
<tr>
<td><xsl:value-of select=″CPU″/></td>
<td><xsl:value-of select=″RAM″/></td>
<td><xsl:value-of select=″HardDisk″/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
输入完毕后将该文件以“computer.xsl”为文件名保存于“computer.xml”文件同一文件夹下。
在5.0版本以上的IE浏览器中打开computer.xml文件,显示的效果如(<a href='H:/Data/pic/60090405d.jpg' target=Pic>图</a>)3所示:
由此可见,XML通过XSL设置的样式,将XML的内容进行转换,并以HTML的方式显示。
3.XSL模板和元素
XSL使用一个或多个模板来定义如何输出XML元素,用一个匹配属性将模板与一个XML元素进行连接,还可用匹配属性为XML文件的一个完整分支定义模板。下面是XSLT的常用元素语法。
(1)xsl:template和xsl:apply-templates元素:
模板(template)是XSL中很重要的概念。XSL文件由模板组成,一个XSL文件至少包含一个模板,不同的模板控制不同的输出格式。
模板由匹配模式和执行两部分组成。其中匹配模式部分定义XML源文件中将被模板处理的节点,执行部分定义输出的格式。这二部分对应的语法分别为xsl:template和xsl:apply-templates。
xsl:template元素的语法如下:
<xsl:template
match = pattern
name = qname
priority = number
mode = qname>
<!-- 执行内容 -->
</xsl:template>
xsl:template元素用于定义新模板。其中name、priority和mode属性分别用于区别匹配同一节点的不同模板。match属性用于控制模板的匹配模式,即设置XML源文件中被模板处理的节点。
如需模板匹配根节点,则可输入以下语句:
<xsl:template match=″/″>
<!-- 文件内容 -->
</xsl:template>
xsl:apply-templates元素的语法如下:
<xsl:apply-templates
select = node set-expression
mode = qname>
</xsl:apply-templates>
xsl:apply-templates元素用于设置被模板具体处理的节点。其中select属性用于定义确切的节点名称。xsl:apply-templates总包含在xsl:template元素中。
(2)xsl:value-of元素:
xsl:value-of元素的语法如下:
<xsl:value-of select=nodename/>
xsl:value-of元素用于将源文件中元素的文本值写至输出文件。其中nodename属性用于设置需输出的元素名称。
(3)xsl:for-each元素:
xsl:for-each元素的语法如下:
<xsl:for-each select=nodename>
<!-- 执行内容 -->
</xsl:for-each>
xsl:for-each元素用于循环处理被选择的节点。其中nodename属性用于设置需循环处理的元素名称。
(4)xsl:if元素:
xsl:if元素的语法如下:
<xsl:if test=逻辑表达式>
<!-- 执行内容 -->
</xsl:if>
xsl:if元素类似程序语言的if条件语句,用于设置当节点满足逻辑条件时才被模板处理。
(5)xsl:choose、xsl:when和xsl:otherwise元素:
由于xsl:if元素未提供类似程序语言的“else”语句属性。因此如需对元素进行多项选择,那么可使用xsl:choose、xsl:when和xsl:otherwise元素来实现流程控制。
xsl:choose元素的语法如下:
<xsl:choose>
<!-- 执行内容 -->
</xsl:choose>
xsl:choose 元素用于对节点进行选择处理。其中执行内容可包含多个xsl:when元素和一个xsl:otherwise元素。
xsl:when元素的语法如下:
<xsl:when test=逻辑表达式>
<!-- 执行内容 -->
</xsl:when>
xsl:when 元素用于对节点进行逻辑选择。其中执行内容为对匹配逻辑表达式的节点进行的操作。
xsl:otherwise元素的语法如下:
<xsl:otherwise>
<!-- 执行内容 -->
</xsl:otherwise>
当xsl:when 元素列举的所有条件均不符合时,将对节点进行由xsl:otherwise元素设置的操作。
(6)xsl:sort元素:
xsl:otherwise元素的语法如下:
<xsl:sort select=nodename/>
xsl:sort元素用于对XML元素进行排序,其中nodename代表需排序的节点名称。
4.动态设置XSL
为XML文件设置XSL,除可使用静态的“<?xml-stylesheet type=″text/xsl″ href=″xsl文件名″?>”语句外,还可通过脚本语言在客户端和服务端分别进行设置。
(1)客户端设置XSL:
如客户端的浏览器支持XML,即可用XSL在浏览器中将文件转换为HTML并输出。较通用的方法可通过JavaScript来实现。在Windows平台下,由于IE5以上的版本提供了XML的解析组件,因此可通过创建XMLDOM对象来为XML动态设置XSL,下面是它的核心代码。
<script language=″javascript″>
//创建XMLDOM对象
var xmldoc = new ActiveXObject(″Microsoft.XMLDOM″);
xmldoc.async = false;
//装载XML文件
xmldoc.load(″computer.xml″);
var xsldoc = new ActiveXObject(″Microsoft.XMLDOM″);
xsldoc.async = false;
//装载XSL文件
xsldoc.load(″computer.xsl ″);
//通过transformNode方法实现动态设置XSL的目的
document.write(xmldoc.transformNode(xsldoc));
</script>
(2)服务端设置XSL:
由于目前并非所有的浏览器均支持XML和XSL,因此可通过服务器将XML转换为HTML。该代码的核心和客户端相似,使用ASP实现的代码如下:
<%
'创建XMLDOM对象
set xmldoc = Server.CreateObject(″Microsoft.XMLDOM″)
xmldoc.async = false
'装载XML文件
xmldoc.load(Server.MapPath(″computer.xml″))
set xsldoc = Server.CreateObject(″Microsoft.XMLDOM″)
xsldoc.async = false
'装载XSL文件
xsldoc.load(Server.MapPath(″computer.xsl″))
'通过transformNode方法实现动态设置XSL的目的
Response.Write(xmldoc.transformNode(xsldoc))
%>
四、完整的XML
1.XML文件约束
XML的优点在于允许用户自定义体现数据之间逻辑关系的标记,以确保文档具有较强的易读性、清晰性和易检索性。因此完全意义上的XML文档必须遵守文档类型定义(DTD)中已声明的规定。
DTD用于描述标记语言的语法和词汇,即定义文档的整体结构及语法。DTD规定了语法分析器为解释有效的XML文件所需获取的所有规则。
(1)DTD的类型:
DTD可内嵌在XML文件的前导声明中,也可作为一个外部文档被引用。
内嵌式DTD:
内嵌DTD的XML文件结构如下:
<?xml version = ″1.0″ encoding=″GB2312″ standalone = ″yes″?>
<!DOCTYPE 根元素名[
元素描述
]>
文件内容...
外部DTD:
使用外部DTD的XML文件结构如下所述:
<?xml version = ″1.0″ encoding=″GB2312″ standalone = ″no″?>
<!DOCTYPE 根元素名SYSTEM ″外部DTD文件名″>
文件内容...
外部DTD可方便地被多个XML文件共享。
(2)DTD元素类型声明:
DTD中使用ETD(Element Type Declaration),即元素类型声明的方法来声明所有有效元素。ETD的语法结构如下:
<!ELEMENT 元素名 元素内容描述>
由XML标准可将元素按内容划分为四类:
(<a href='H:/Data/pic/60090405e.jpg' target=Pic>图</a>)
(3)DTD元素属性声明:
在DTD中也可定义属性,其语法如下:
<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
其中元素名属性为属性所属的元素名字。属性名为属性的命名。缺省值属性代表属性初值,其可设置的类型如下表所示:
(<a href='H:/Data/pic/60090405f.jpg' target=Pic>图</a>)
属性类型用于设置该属性隶属的有效属性类型,有效属性类型如下表所示:
(<a href='H:/Data/pic/60090405g.jpg' target=Pic>图</a>)
2.XML Schema
(1)XML Schema概述:
作为XML 1.0规范的重要组成部分,DTD对于XML文件的结构可进行详细地描述。但其采用非XML的语法规则、不支持数据类型且扩展性较差。因此诞生了XML Schema,并逐渐配合DTD共同使XML文件结构得到更好的描述。XML Schema的优点如下:
一致性:XML Schema直接利用XML的基本语法规则来定义文件结构,使XML实现了完美的统一,为XML的进一步发展奠定基础。
扩展性:XML Schema对DTD进行扩充,引入数据类型和命名空间,使其具备更强的可扩展性。
互换性:XML Schema可验证XML文件的合法性,并通过特定的映射机制,将不同的XML Schema进行转换,实现高层次的数据交换。
规范性:XML Schema提供完整的机制以约束XML标记的使用,利用元素的内容和属性来定义整体结构。
(2)XML Schema声明语句:
XML Schema声明语句有二种:
xmlns=″urn:schemas-microsoft-com:xml-data″:该语句说明文件为一个XML Schema文件。
xmlns:dt=″urn:schemas-microsoft-com:datatypes″:该语句定义在文件中可使用的数据类型。
(3)XML Schema语法:
完整的XML Schema语法涉及的关键元素如下:
Schema元素:该元素是XML Schema中首个出现的元素,用于声明该XML文件为一个Schema文件。Schema元素具有两个属性,name属性用于设置该Schema的名称;xmlns属性用于设置该Schema包含的命名空间。
ElementType元素:该元素定义文件中使用的元素。通过content属性可声明元素是否为空、是否包含文本、是否包含子元素或既包含文本又包含子元素。
AttributeType元素:该元素定义文件中出现的属性类型。
group元素:该元素用于将XML 文件中的元素分组。通过order属性可设置分组或子分组中的元素顺序。
datatype元素:该元素用于为ElementType和AttributeType指定数据类型。
description元素:该元素用于为ElementType和AttributeType元素设置描述信息。
3.XML命名空间
为解决自定义标志中出现的“名称冲突”(即不同的实体使用同一标志进行描述)现象,可将不同的实体赋予不同的命名空间,解析器则通过命名空间来区分元素,即XML命名空间。
XML命名空间采用两段式命名法解决命名冲突问题,即第一段为代表特定命名空间的前缀,第二段为元素或属性原名,两段之间用冒号分隔。
XML命名空间的定义由命名空间声明、合法名称定义及应用命名空间的作用域三部分组成。
(1)XML命名空间声明:
XML命名空间声明通过保留属性“xmlns“实现。命名空间声明包括直接和缺省定义二种方式:
直接定义方式:xmlns: [命名空间前缀] = [命名空间名]。
缺省定义方式:xmlns = [命名空间名]。
(2)合法名称定义:
合法名称由冒号分隔的前缀和本地部分组成,其中前缀和本地部分必须均为合法的XML名称。
(3)命名空间的作用域:
命名空间的作用域指命名空间声明可作用的元素和属性。一般命名空间声明可作用至说明其的元素和该元素的所有内容。
五、XML开发实例
1.网络开发实例
(1)将XML文件装载至数据岛:
在HTML中,可使用数据岛的方式来访问XML文件。在HTML页面内部以数据岛方式装载XML文件的语法如下所示:
<xml src=″XML文件名″ id=″数据岛名称″ async=″false″> </xml>
其中XML文件名属性可为任何符合语法的XML文件,数据岛名称属性为该文件的别名,程序中将通过该别名来访问。async=″false″ 属性可保证在进行其他HTML处理前,装载所有的XML数据。
(2)将数据岛绑定至HTML表格:
装载XML数据后即可通过HTML表格的方式显示。将XML数据绑定至HTML表格,只需在表格中增加数据源属性即可,语法如下:
<table datasrc=″#数据岛名称″>
(3)将数据岛绑定至<span>或<div>元素:
将XML数据绑定至表格后,可通过<span>或<div>元素显示XML数据。只需对页面中的<span>或<div>元素设置数据源属性即可,语法如下:
<span datasrc=″#数据岛名称″ datafld=″对应的XML标记″></span>
<div datasrc=″#数据岛名称″ datafld=″对应的XML标记″></div>
2.应用程序开发实例
XML文件的插入、修改或检索等操作均可通过XML解析器及其提供的对象来实现。Microsoft的XML解析器通过msxml.dll动态链接库文件提供,该链接库文件为一COM对象,因此可在Windows下的任何开发语言中使用。以下以VB为例进行介绍。
在VB中使用msxml.dll提供的COM对象,需在“引用”中添加“Microsoft XML, version 2.0”或更高版本的引用。
MSXML.DLL提供的主要COM接口如下表所示:
(<a href='H:/Data/pic/60090405h.jpg' target=Pic>图</a>)
下面是它的具体使用方法。
(1)定义对象:
常用XML接口对象的定义语法如下所示:
Dim xml As New DOMDocument '创建DOMDocument对象
Dim root As IXMLDOMElement '创建IXMLDOMElement对象
Dim node As IXMLDOMNode '创建IXMLDOMNode对象
(2)文件操作:
常用的XML文件操作语法如下所述:(使用前述定义的XML接口对象,下同)
加载XML文件:xml.Load (XML文件名)
加载XML数据:xml.Load(XML数据字符串)
保存XML文件:xml.Save(XML文件名)
(3)数据查询:
可通过DOMDocument对象来实现XML数据的查询,操作语法如下所述:
查询已知路径的节点:xml.SelectNodes(节点的绝对路径或相对路径)
该方法返回NodeList对象,如需返回单个节点可使用SelectSingleNode方法。如未查询出任何节点,则返回Nothing。
查询已知元素名的节点:由于中间层次的元素名未知,因此可使用“//”符号来代表中间节点,以查询多层次下的其他元素。
xml.SelectNodes(带“//”符号的节点路径)
查询属性节点:在属性名前添加“@”符号即可返回属性节点。
xml.SelectNodes(带“@”符号的节点路径)
查询Text节点:使用“text()”关键字即可获取Text节点。
xml.SelectSingleNode(带“text()”关键字的节点路径)
查询特定条件节点:使用“[]”符号即可查询特定条件的节点。
xml.SelectSingleNode(带“[]”符号的节点表达式)
查询多重模式节点:使用“|”符号即可获取多重模式节点。
xml.SelectNodes(带“|”符号的节点路径)
查询任意子节点:使用“*”符号即可获取当前节点的所有子节点。
xml.SelectNodes(带“*”符号的节点路径)
对于大型的复杂文档,XML更是一种理想语言,其不仅允许指定文档中的词汇,且允许指定元素之间的关系。随着网络的发展,XML在网络开发中的地位已逐渐赶上HTML,很多浏览器已可良好地支持XML,XML正成为一种网络未来发展的主流语言。
一、XML概述
1.什么是XML
从不同的角度分析,XML有不同的解释,具体如下所述:
(1)XML是一种置标语言,置标指开发者可按需自定义任何符合规则的标记,而HTML仅是一种预定义标记语言,只可解析已定义的标记,对于自定义标记则无法解析。
(2)XML是一种语义结构化语言,合理地描述了文件的结构和语义。
(3)XML是一种通用的数据格式,也是一种简单的数据格式,由纯ASCII文本构成,因此抗破坏能力很强。
(4)从高级角度分析,XML是一种自描述语言。
2.XML的常用术语
(1)DTD(Document Type Definition):即文件类型定义。定义的内容包括允许使用的标签、标签元素嵌套的方式及处理方法。XML标准不强制标记设计者使用DTD,但大部分基于XML开发的新语言均带有DTD,使开发者较易编写可理解的标记并编制出巧妙的软件。
(2)XML文件:XML文件由DTD和XML文本组成,简单的XML文本可不包含DTD。
(3)XSL和CSS:XML可定义信息内容,但无法定义信息的表现形式。XML通过XSL(XML Style Language,XML样式语言)和CSS(Cascading Style Sheets,层叠样式表)来实现信息的转换。
(4)XML Schema:虽然DTD限制标记的使用,但对于XML的自动处理仍需更严格和全面的工具,由此出现XML Schema。
(5)DOM(Document Object Model):即文件对象模型。其将XML文件内容转换为一个对象模型,为应用程序提供访问XML文件的接口。
(6)XSLT(XML Stylesheet Language Transformation):即XML样式转换语言。XSLT可从一个已定义的XML文件抽取所需的数据,并组成不同的形式。
(7)Xpointer和Xlinks:Xpointer和Xlinks类似于HTML中的超级链接,用于链接其他XML文件或XML文件中的部分。
(8)XML 框架:XML框架用于控制XML文件结构,是一种高层次的结构控制。
二、XML语法详解
1.XML的文件结构
如前所述,XML允许自定义标记来形象地描述信息,假设需描述一台计算机的基本配置,可自定义一些易于理解的标记,如“computer”、“CPU”等。那么通过使用这些标记,一台计算机的基本配置,用XML描述如下所述:
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
</computer>
上述内容,稍具计算机知识的读者可迅速地理解,也正是XML的优点。当然,标准的XML还需在文件的第一行添加“<?xml version=″1.0″?>”的声明语句,以表示该文件使用的XML版本。XML声明是一种处理指令。完整的XML声明示例如下所述:
<?xml version = ″1.0″ encoding = ″GB2312″ standalone = ″no″?>
在声明中必须包括“version”属性,用于设置所采用的XML版本号,且必须在属性列表中第一个出现。“standalone”属性代表该XML文档是否和一个外部文档类型定义DTD配套使用。“encoding”属性则设置数据所采用的编码标准。
XML文件通常以XML声明开始,通过XML元素来组织数据。XML元素包括标记和字符数据。为使数据组织更方便、清晰,可在字符数据中添加CDATA数据块,并可添加注释。
综上所述,可得XML文件的基本结构,如下所述:
(1)XML文件以XML声明开始。
(2)处理指令以“<?”字符开始,以“?>”结束,“<?”后的第一个单词为处理指令名。
(3)自定义的标记用“<”和“>”字符包含,标记需成对出现,后一个标志需以“</”开始。
(4)XML元素可包含正文和其他元素,但元素必须严格嵌套,即每个起始标记必须有对应的结束标记。
(5)XML元素不能重叠。
XML文件是纯文本文件,可用任何文本编辑器进行编制。如将前述计算机配置的XML文件在文本编辑器中以“xml”扩展名保存后,在5.0版本以上的IE浏览器中浏览,效果如<a href='H:/Data/pic/60090405a.jpg' target=Pic>图</a>1所示:
2.XML文件的元素
XML文件的元素可扩展,彼此之间存在关联,且元素的命名规则非常简单,如下所述:
(1)XML元素可扩展:
XML文件可进行扩展以保存更多的信息,如可为上文介绍的计算机基本配置的XML文件增加显示器内容,只需直接在原XML文件中加入“Monitor”标记即可,如下:
<?xml version = ″1.0″ encoding = ″GB2312″ standalone = ″no″?>
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
<Monitor>PHILIPS 107T</Monitor>
</computer>
(2)XML元素彼此关联:
XML元素之间的关系如同一棵节点组成的树,各节点之间存在“兄弟”或“父子”的概念,在前述的计算机配置XML文件中,“computer”为根元素,“CPU”、“RAM”和“HardDisk”等均为“computer”的子元素。反之,“computer”是“CPU”和“RAM”的父元素。“CPU”和“RAM”之间由于其父元素相同,因此为兄弟元素。
(3)XML元素对大小写敏感:
XML元素对于大小写敏感,因此“<Computer>”和“<computer>”是不同的元素。
(4)空元素的表示:
XML表示空元素非常方便,将一个标签以“/>”符号结尾即表示空元素。
(5)XML元素的保留字符:
由于某些字符为XML语法结构的组成部分,因此如需在XML数据中引用,必须用特殊的字符来代替,这些字符和代替的字符如下表所示:
(<a href='H:/Data/pic/60090405b.jpg' target=Pic>图</a>)
(6)根元素的唯一性:
每个XML文件必须有唯一的根元素,如在上述的计算机配置XML文件中。“computer”为该XML文件的唯一根元素。
(7)元素的内容:
XML元素包含不同的内容类型。一个XML元素由元素起始标记至结束标记之间的全部内容组成。一个元素可包含元素内容、混合内容、简单内容和空内容,还可包含属性。
(8)元素的命名:
XML元素必须遵循的命名规则如下所述:
名字中可包含字母、数字及其他字母(如汉字);名字不能以数字或下划线开头;名字不能以字母“xml”(或XML、Xml等)开头;名字中不能包含空格;名字中不能使用“:”,由于其已为命名空间(namespaces)所保留。
自定义元素名时,有一些技巧可供参考,如下所述:
名字应具有描述性,可通过下划线的方式使名称更形象;名字不易过长;由于XML文件通常和数据库相连接,因此建议将数据库的字段名称和XML文件元素名称相对应;非英文字母在XML元素名称中合法,但取决于解析器是否支持。
3.XML属性
类似于HTML标记,XML元素也可在其起始标记中设计属性,以提供有关元素的附加信息。属性所提供的信息通常非数据的组成部分。
属性值必须包含在引号中,且单、双引号均可使用。如可为计算机配置XML文件的“computer”标记增加一个用户的属性,如下所示:
<computer user=″马前雪″>
在单、双引号中,双引号较常用,但如属性值本身包含引号,则必须使用单引号。
4.CDATA标记
在CDATA标记下,所有的标记或实体引用均被XML解析器忽略,并作为字符数据处理。CDATA标记的语法如下所示:
<![CDATA[
文本内容
]] >
CDATA标记中的文本内容不能出现字符串“]]>”,此外CDATA标记不能嵌套。
如可将计算机配置XML文件的“CPU”标记用“CDATA”标记包括,如下所示:
<![CDATA[
<CPU>P4</CPU>
]]>
5.XML注释
如需进一步增强XML文件的可读性,可添加解释性的字符数据,且希望XML解析器不对这些数据进行处理,该类型的信息称作注释。在XML中注释方法与HTML完全相同,用“<!--”和“-->”将注释文本包含即可。
XML的注释有一些语法规则,如下所述:
(1)注释文本中不能出现“-”字符或“--”字符串。
(2)注释文本不能嵌入标记中,也不能放在标记声明之中或之前。
(3)注释不能被嵌套。
如可为计算机配置XML文件增加注释,如下所示:
<!-- 用XML描述计算机配置 -->
在5.0版本以上的IE浏览器中浏览,效果如<a href='H:/Data/pic/60090405c.jpg' target=Pic>图</a>2所示:
三、XSL概述
1.什么是XSL
XSL(可扩展样式表语言),即XML的样式表。由于XML可按需使用任意标记,因此标记的含义无法被直接解析。鉴于此,浏览器无法获悉如何显示一个XML文件。为显示XML文件,必须通过一个机制来描述显示的方式。XSL是XML的首选样式表语言,其不仅是样式表,且还是转换XML文件、定义XML部分和模式及格式化XML文件的方法。XSL语言的组成部分如下:
XSLT:一种用于转换XML的语言。
XPath:一种用于定义XML部分或模式的语言。
2.XSL转换方法
XSLT是一种将XML文件转换为其他类型文件或XML文件的语言。XPath是一种对XML文件的部分进行寻址的语言。格式化是将XSL转换结果变为适当输出格式的过程。通常XSLT将每个XML元素转换为HTML元素,还可向输出文件中增加或删除一些元素。
在转换过程中,XSLT用XPath定义源文件中与一个或多个预定模板相匹配的部分。当找到一个匹配时,XSLT将源文件中的匹配部分转换为结果文件,源文件中不与任何一个模板匹配的部分在结果中保持不变。
为理解XSL转换的效果,需创建一个结合XSL的XML文件,在后续内容中将以该文件为例进行介绍,其内容如下:
<?xml version=″1.0″?>
<?xml-stylesheet type=″text/xsl″ href=″computer.xsl″?>
<mycomputer>
<computer>
<CPU>P4</CPU>
<RAM>256M</RAM>
<HardDisk>80G</HardDisk>
</computer>
<computer>
<CPU>C4</CPU>
<RAM>128M</RAM>
<HardDisk>40G</HardDisk>
</computer>
</mycomputer>
该文件包含二台计算机的配置,因此按前述的XML文件结构,需增加一个唯一的根节点“mycomputer”,最后将该文件以“computer.xml”为文件名保存。
在该文件中,“<?xml-stylesheet type=″text/xsl″ href=″computer.xsl″?>”语句用于关联一个XSL文件,该XSL文件的内容如下所示:
<?xml version=′1.0′?>
<xsl:stylesheet xmlns:xsl=″http://www.w3.org/TR/WD-xsl″>
<xsl:template match=″/″>
<html>
<body>
<table border=″2″>
<tr>
<td>CPU</td>
<td>RAM</td>
<td>HardDisk</td>
</tr>
<xsl:for-each select=″mycomputer/computer″>
<tr>
<td><xsl:value-of select=″CPU″/></td>
<td><xsl:value-of select=″RAM″/></td>
<td><xsl:value-of select=″HardDisk″/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
输入完毕后将该文件以“computer.xsl”为文件名保存于“computer.xml”文件同一文件夹下。
在5.0版本以上的IE浏览器中打开computer.xml文件,显示的效果如(<a href='H:/Data/pic/60090405d.jpg' target=Pic>图</a>)3所示:
由此可见,XML通过XSL设置的样式,将XML的内容进行转换,并以HTML的方式显示。
3.XSL模板和元素
XSL使用一个或多个模板来定义如何输出XML元素,用一个匹配属性将模板与一个XML元素进行连接,还可用匹配属性为XML文件的一个完整分支定义模板。下面是XSLT的常用元素语法。
(1)xsl:template和xsl:apply-templates元素:
模板(template)是XSL中很重要的概念。XSL文件由模板组成,一个XSL文件至少包含一个模板,不同的模板控制不同的输出格式。
模板由匹配模式和执行两部分组成。其中匹配模式部分定义XML源文件中将被模板处理的节点,执行部分定义输出的格式。这二部分对应的语法分别为xsl:template和xsl:apply-templates。
xsl:template元素的语法如下:
<xsl:template
match = pattern
name = qname
priority = number
mode = qname>
<!-- 执行内容 -->
</xsl:template>
xsl:template元素用于定义新模板。其中name、priority和mode属性分别用于区别匹配同一节点的不同模板。match属性用于控制模板的匹配模式,即设置XML源文件中被模板处理的节点。
如需模板匹配根节点,则可输入以下语句:
<xsl:template match=″/″>
<!-- 文件内容 -->
</xsl:template>
xsl:apply-templates元素的语法如下:
<xsl:apply-templates
select = node set-expression
mode = qname>
</xsl:apply-templates>
xsl:apply-templates元素用于设置被模板具体处理的节点。其中select属性用于定义确切的节点名称。xsl:apply-templates总包含在xsl:template元素中。
(2)xsl:value-of元素:
xsl:value-of元素的语法如下:
<xsl:value-of select=nodename/>
xsl:value-of元素用于将源文件中元素的文本值写至输出文件。其中nodename属性用于设置需输出的元素名称。
(3)xsl:for-each元素:
xsl:for-each元素的语法如下:
<xsl:for-each select=nodename>
<!-- 执行内容 -->
</xsl:for-each>
xsl:for-each元素用于循环处理被选择的节点。其中nodename属性用于设置需循环处理的元素名称。
(4)xsl:if元素:
xsl:if元素的语法如下:
<xsl:if test=逻辑表达式>
<!-- 执行内容 -->
</xsl:if>
xsl:if元素类似程序语言的if条件语句,用于设置当节点满足逻辑条件时才被模板处理。
(5)xsl:choose、xsl:when和xsl:otherwise元素:
由于xsl:if元素未提供类似程序语言的“else”语句属性。因此如需对元素进行多项选择,那么可使用xsl:choose、xsl:when和xsl:otherwise元素来实现流程控制。
xsl:choose元素的语法如下:
<xsl:choose>
<!-- 执行内容 -->
</xsl:choose>
xsl:choose 元素用于对节点进行选择处理。其中执行内容可包含多个xsl:when元素和一个xsl:otherwise元素。
xsl:when元素的语法如下:
<xsl:when test=逻辑表达式>
<!-- 执行内容 -->
</xsl:when>
xsl:when 元素用于对节点进行逻辑选择。其中执行内容为对匹配逻辑表达式的节点进行的操作。
xsl:otherwise元素的语法如下:
<xsl:otherwise>
<!-- 执行内容 -->
</xsl:otherwise>
当xsl:when 元素列举的所有条件均不符合时,将对节点进行由xsl:otherwise元素设置的操作。
(6)xsl:sort元素:
xsl:otherwise元素的语法如下:
<xsl:sort select=nodename/>
xsl:sort元素用于对XML元素进行排序,其中nodename代表需排序的节点名称。
4.动态设置XSL
为XML文件设置XSL,除可使用静态的“<?xml-stylesheet type=″text/xsl″ href=″xsl文件名″?>”语句外,还可通过脚本语言在客户端和服务端分别进行设置。
(1)客户端设置XSL:
如客户端的浏览器支持XML,即可用XSL在浏览器中将文件转换为HTML并输出。较通用的方法可通过JavaScript来实现。在Windows平台下,由于IE5以上的版本提供了XML的解析组件,因此可通过创建XMLDOM对象来为XML动态设置XSL,下面是它的核心代码。
<script language=″javascript″>
//创建XMLDOM对象
var xmldoc = new ActiveXObject(″Microsoft.XMLDOM″);
xmldoc.async = false;
//装载XML文件
xmldoc.load(″computer.xml″);
var xsldoc = new ActiveXObject(″Microsoft.XMLDOM″);
xsldoc.async = false;
//装载XSL文件
xsldoc.load(″computer.xsl ″);
//通过transformNode方法实现动态设置XSL的目的
document.write(xmldoc.transformNode(xsldoc));
</script>
(2)服务端设置XSL:
由于目前并非所有的浏览器均支持XML和XSL,因此可通过服务器将XML转换为HTML。该代码的核心和客户端相似,使用ASP实现的代码如下:
<%
'创建XMLDOM对象
set xmldoc = Server.CreateObject(″Microsoft.XMLDOM″)
xmldoc.async = false
'装载XML文件
xmldoc.load(Server.MapPath(″computer.xml″))
set xsldoc = Server.CreateObject(″Microsoft.XMLDOM″)
xsldoc.async = false
'装载XSL文件
xsldoc.load(Server.MapPath(″computer.xsl″))
'通过transformNode方法实现动态设置XSL的目的
Response.Write(xmldoc.transformNode(xsldoc))
%>
四、完整的XML
1.XML文件约束
XML的优点在于允许用户自定义体现数据之间逻辑关系的标记,以确保文档具有较强的易读性、清晰性和易检索性。因此完全意义上的XML文档必须遵守文档类型定义(DTD)中已声明的规定。
DTD用于描述标记语言的语法和词汇,即定义文档的整体结构及语法。DTD规定了语法分析器为解释有效的XML文件所需获取的所有规则。
(1)DTD的类型:
DTD可内嵌在XML文件的前导声明中,也可作为一个外部文档被引用。
内嵌式DTD:
内嵌DTD的XML文件结构如下:
<?xml version = ″1.0″ encoding=″GB2312″ standalone = ″yes″?>
<!DOCTYPE 根元素名[
元素描述
]>
文件内容...
外部DTD:
使用外部DTD的XML文件结构如下所述:
<?xml version = ″1.0″ encoding=″GB2312″ standalone = ″no″?>
<!DOCTYPE 根元素名SYSTEM ″外部DTD文件名″>
文件内容...
外部DTD可方便地被多个XML文件共享。
(2)DTD元素类型声明:
DTD中使用ETD(Element Type Declaration),即元素类型声明的方法来声明所有有效元素。ETD的语法结构如下:
<!ELEMENT 元素名 元素内容描述>
由XML标准可将元素按内容划分为四类:
(<a href='H:/Data/pic/60090405e.jpg' target=Pic>图</a>)
(3)DTD元素属性声明:
在DTD中也可定义属性,其语法如下:
<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
其中元素名属性为属性所属的元素名字。属性名为属性的命名。缺省值属性代表属性初值,其可设置的类型如下表所示:
(<a href='H:/Data/pic/60090405f.jpg' target=Pic>图</a>)
属性类型用于设置该属性隶属的有效属性类型,有效属性类型如下表所示:
(<a href='H:/Data/pic/60090405g.jpg' target=Pic>图</a>)
2.XML Schema
(1)XML Schema概述:
作为XML 1.0规范的重要组成部分,DTD对于XML文件的结构可进行详细地描述。但其采用非XML的语法规则、不支持数据类型且扩展性较差。因此诞生了XML Schema,并逐渐配合DTD共同使XML文件结构得到更好的描述。XML Schema的优点如下:
一致性:XML Schema直接利用XML的基本语法规则来定义文件结构,使XML实现了完美的统一,为XML的进一步发展奠定基础。
扩展性:XML Schema对DTD进行扩充,引入数据类型和命名空间,使其具备更强的可扩展性。
互换性:XML Schema可验证XML文件的合法性,并通过特定的映射机制,将不同的XML Schema进行转换,实现高层次的数据交换。
规范性:XML Schema提供完整的机制以约束XML标记的使用,利用元素的内容和属性来定义整体结构。
(2)XML Schema声明语句:
XML Schema声明语句有二种:
xmlns=″urn:schemas-microsoft-com:xml-data″:该语句说明文件为一个XML Schema文件。
xmlns:dt=″urn:schemas-microsoft-com:datatypes″:该语句定义在文件中可使用的数据类型。
(3)XML Schema语法:
完整的XML Schema语法涉及的关键元素如下:
Schema元素:该元素是XML Schema中首个出现的元素,用于声明该XML文件为一个Schema文件。Schema元素具有两个属性,name属性用于设置该Schema的名称;xmlns属性用于设置该Schema包含的命名空间。
ElementType元素:该元素定义文件中使用的元素。通过content属性可声明元素是否为空、是否包含文本、是否包含子元素或既包含文本又包含子元素。
AttributeType元素:该元素定义文件中出现的属性类型。
group元素:该元素用于将XML 文件中的元素分组。通过order属性可设置分组或子分组中的元素顺序。
datatype元素:该元素用于为ElementType和AttributeType指定数据类型。
description元素:该元素用于为ElementType和AttributeType元素设置描述信息。
3.XML命名空间
为解决自定义标志中出现的“名称冲突”(即不同的实体使用同一标志进行描述)现象,可将不同的实体赋予不同的命名空间,解析器则通过命名空间来区分元素,即XML命名空间。
XML命名空间采用两段式命名法解决命名冲突问题,即第一段为代表特定命名空间的前缀,第二段为元素或属性原名,两段之间用冒号分隔。
XML命名空间的定义由命名空间声明、合法名称定义及应用命名空间的作用域三部分组成。
(1)XML命名空间声明:
XML命名空间声明通过保留属性“xmlns“实现。命名空间声明包括直接和缺省定义二种方式:
直接定义方式:xmlns: [命名空间前缀] = [命名空间名]。
缺省定义方式:xmlns = [命名空间名]。
(2)合法名称定义:
合法名称由冒号分隔的前缀和本地部分组成,其中前缀和本地部分必须均为合法的XML名称。
(3)命名空间的作用域:
命名空间的作用域指命名空间声明可作用的元素和属性。一般命名空间声明可作用至说明其的元素和该元素的所有内容。
五、XML开发实例
1.网络开发实例
(1)将XML文件装载至数据岛:
在HTML中,可使用数据岛的方式来访问XML文件。在HTML页面内部以数据岛方式装载XML文件的语法如下所示:
<xml src=″XML文件名″ id=″数据岛名称″ async=″false″> </xml>
其中XML文件名属性可为任何符合语法的XML文件,数据岛名称属性为该文件的别名,程序中将通过该别名来访问。async=″false″ 属性可保证在进行其他HTML处理前,装载所有的XML数据。
(2)将数据岛绑定至HTML表格:
装载XML数据后即可通过HTML表格的方式显示。将XML数据绑定至HTML表格,只需在表格中增加数据源属性即可,语法如下:
<table datasrc=″#数据岛名称″>
(3)将数据岛绑定至<span>或<div>元素:
将XML数据绑定至表格后,可通过<span>或<div>元素显示XML数据。只需对页面中的<span>或<div>元素设置数据源属性即可,语法如下:
<span datasrc=″#数据岛名称″ datafld=″对应的XML标记″></span>
<div datasrc=″#数据岛名称″ datafld=″对应的XML标记″></div>
2.应用程序开发实例
XML文件的插入、修改或检索等操作均可通过XML解析器及其提供的对象来实现。Microsoft的XML解析器通过msxml.dll动态链接库文件提供,该链接库文件为一COM对象,因此可在Windows下的任何开发语言中使用。以下以VB为例进行介绍。
在VB中使用msxml.dll提供的COM对象,需在“引用”中添加“Microsoft XML, version 2.0”或更高版本的引用。
MSXML.DLL提供的主要COM接口如下表所示:
(<a href='H:/Data/pic/60090405h.jpg' target=Pic>图</a>)
下面是它的具体使用方法。
(1)定义对象:
常用XML接口对象的定义语法如下所示:
Dim xml As New DOMDocument '创建DOMDocument对象
Dim root As IXMLDOMElement '创建IXMLDOMElement对象
Dim node As IXMLDOMNode '创建IXMLDOMNode对象
(2)文件操作:
常用的XML文件操作语法如下所述:(使用前述定义的XML接口对象,下同)
加载XML文件:xml.Load (XML文件名)
加载XML数据:xml.Load(XML数据字符串)
保存XML文件:xml.Save(XML文件名)
(3)数据查询:
可通过DOMDocument对象来实现XML数据的查询,操作语法如下所述:
查询已知路径的节点:xml.SelectNodes(节点的绝对路径或相对路径)
该方法返回NodeList对象,如需返回单个节点可使用SelectSingleNode方法。如未查询出任何节点,则返回Nothing。
查询已知元素名的节点:由于中间层次的元素名未知,因此可使用“//”符号来代表中间节点,以查询多层次下的其他元素。
xml.SelectNodes(带“//”符号的节点路径)
查询属性节点:在属性名前添加“@”符号即可返回属性节点。
xml.SelectNodes(带“@”符号的节点路径)
查询Text节点:使用“text()”关键字即可获取Text节点。
xml.SelectSingleNode(带“text()”关键字的节点路径)
查询特定条件节点:使用“[]”符号即可查询特定条件的节点。
xml.SelectSingleNode(带“[]”符号的节点表达式)
查询多重模式节点:使用“|”符号即可获取多重模式节点。
xml.SelectNodes(带“|”符号的节点路径)
查询任意子节点:使用“*”符号即可获取当前节点的所有子节点。
xml.SelectNodes(带“*”符号的节点路径)