- 第11章 XML与LINQ to XML
第11章 XML与LINQ to XML
对于XML(Extensible Markup Language,可扩展标记语言)这个词语,相信大家并不陌生。它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。它是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以以任何方便的方式建立。虽然它只能够算是一种普通文本,但它却提供了几乎可以在任何多个程序之间共享数据的方式。例如,目前在网站信息传递中常用的RSS(Really Simple Syndication,聚合内容)就是典型的XML应用。
11.1 XML概述
上面已经讲过,XML是一种简单的数据存储语言,它使用一系列简单的标记描述数据。但它与Access、SQL Server和Oracle等数据库却存在着本质的不同,数据库提供了更强有力的数据存储和分析能力。例如,数据索引、排序、查找、相关一致性等,而XML仅仅是展示数据。
除此之外,XML与HTML也存在着很大的区别,XML是用来存储数据的,重在数据本身;而HTML是用来定义数据的,重在数据的显示模式。因此,XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言。
简单地讲,一个简单的XML文档((Dcument)主要由声明((Dclaration)、元素((Eement)、节点((Nde)与属性((Atribute)等组成。如下面的示例所示:
<?xml version="1.0"encoding="utf-8"?>
<plugin-menu>
<group name="报表管理系统"visible="true"
image="Image/sys.gif"order="1">
<group name="生产日报表"visible="true"
image="Image/rday.gif"order="1">
<item visible="true"image="Image/day.gif"order="1">
<url>ReportForms/Day.aspx</url>
<title>生产进度日报</title>
<description>工程部生产进度日报</description>
</item>
<item visible="true"image="Image/month.gif"order="2">
<url>ReportForms/Month.aspx</url>
<title>生产进度月报</title>
<description>工程部生产进度月报</description>
</item>
</group>
</group>
</plugin-menu>
11.1.1 XML声明
XML声明通常在XML文档的第一行出现。XML声明不是必选项,但是如果使用XML声明,必须在文档的第一行,前面不得包含任何其他内容或空白。文档映射中的XML声明包含下列内容:
(1)版本号
<?xml version="1.0"?>
版本号属于声明中的必选项,尽管以后的XML版本可能会更改该数字,但是1.0是当前的版本。
(2)编码声明
<?xml version="1.0"encoding="UTF-8"?>
编码声明属于可选项。如果使用编码声明,必须紧接着在XML声明的版本信息之后,并且必须包含代表现有字符编码的值。例如,以下是使用ISO-8859-1的文档的编码声明:
<?xml version="1.0"encoding="ISO-8859-1"?>
除此之外,XML声明还可以包含独立声明。例如:
<?xml version="1.0"encoding="UTF-8"standalone="yes"?>
与编码声明类似,独立声明也是可选项。如果使用独立声明,必须在XML声明的最后。
11.1.2 XML元素
元素的作用是将有关事物的所有描述信息黏合到一起,它可以是任何内容。元素会为描述性信息定义一个清楚的起始点和结束点。通常,元素存在于成对的开始和结束的标记中。然而,开始标记也可以自动结束,实质上它可以定义空元素。
XML元素的结构和HTML标记的结构很相似。开始标记以左尖括号(<)开始,包含名称和可能的属性,最后以右尖括号(>)结束。如:
<group name="报表管理系统"visible="true"
image="Image/sys.gif"order="1">
</group>
元素也可以包含属性作为元素的打开标记(但不是关闭标记)的一部分。而且,元素可以包含其他的元素,但是如果包含的话,在关闭外层元素之前必须先关闭内层的元素。如:
<item visible="true"image="Image/day.gif"order="1">
<url>ReportForms/Day.aspx</url>
<title>生产进度日报</title>
<description>工程部生产进度日报</description>
</item>
11.1.3 XML节点
在了解节点之前,首先要了解根节点。
每个XML文档都必须有且仅有一个(不能多也不能少)根节点。根节点是包含了文档中其他元素(如果有其他元素)的节点,如上面示例中的<plugin-menu>节点。可以把根节点想象成把其下面的所有节点连接在一起并且在任何特定XML文档的范围内为子节点提供结构的统一节点。
根节点和其他任何元素一样,都遵循相同的命名架构。但有一点例外,根节点的名称在文档中必须是唯一的。也就是说,整个文档中,其他任何的元素不可以和根节点有相同的名称。
一个根节点下可以包括任意多个节点元素,而节点元素中同样可以包含多个子节点元素,这样一个完整的XML文档就形成了一个类似树形的结构。
11.1.4 XML属性
通过属性可以使用“名值对”添加与元素有关的信息。属性经常用于为不属于元素内容的元素定义属性,尽管在某些情况下,元素内容由属性值确定。属性可以出现在开始标记中,也可以出现在空标记中,但是不能出现在结束标记中。如下所示:
<group name="报表管理系统"visible="true"
image="Image/sys.gif"order="1">
</group>
属性必须有名称和值,不允许没有值的属性名。同一个元素中不能包含两个同名的属性。与元素名一样,属性名区分大小写,并且必须以字母或下划线开头,名称的其他部分可以包含字母、数字、连字符、下划线和句点;属性值必须遵循与正常文本内容相同的规则,并增加了一些限制,属性值只能包含文本,不能包含元素标记。属性值中允许包含实体引用和字符引用,但是不允许包含CDATA节。
XML规范允许使用单引号或双引号指示属性,尽管属性值两侧所使用的引号类型必须相同。但是,属性值两侧必须使用引号。XML分析器将简单地拒绝属性值两侧未使用引号的文档,并报告错误。
如果使用单引号指示属性值,必须使用'实体引用显示属性值中的单引号。如下面的示例所示:
<myElement contraction='isn't'/>
如果使用双引号指示属性值,必须使用"实体引用显示属性值中的双引号。如下面的示例所示:
<myElement question="They asked"Why?""/>
但是,在加单引号的属性值中可以使用双引号,同样也可以在双引号的属性值中使用单引号。如下面的示例所示:
<myElement contraction="isn't"/>
<myElement question='They asked"Why?"'/>
也可以在同一元素中不同的属性值上使用不同类型的引号。如下面的示例所示:
<myElement contraction="isn't"question='They asked"Why?"'/>