XmlDataSource 控件使得 XML 数据可用于数据绑定控件。可以使用该控件同时显示分层数据和表格数据。在只读情况下,XmlDataSource 控件通常用于显示分层 XML 数据。
一、说明
XmlDataSource 从使用 DataFile 属性指定的 XML 文件加载 XML 数据。另外,还可以从使用 Data 属性的字符串加载 XML 数据。
XmlDataSource 控件将 XML 元素的属性公开为可绑定数据的字段。如果要绑定非属性的值,则可以使用可扩展样式表语言 (XSL) 样式表指定转换。在 FormView 或 GridView 等控件模板中,您还可以使用 XPath 数据绑定功能将模板中的控件绑定到 XML 数据。
下面的代码示例演示一个 XmlDataSource 和绑定到它的一个 TreeView 控件。源 XML 显示在代码示例之后。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:XmlDataSource
id="PeopleDataSource"
runat="server"
DataFile="~/App_Data/people.xml" />
<asp:TreeView
id="PeopleTreeView"
runat="server"
DataSourceID="PeopleDataSource">
<DataBindings>
<asp:TreeNodeBinding DataMember="LastName" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="FirstName" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="Street" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="City" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="Region" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="ZipCode" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="Title" TextField="#InnerText" />
<asp:TreeNodeBinding DataMember="Description" TextField="#InnerText" />
</DataBindings>
</asp:TreeView>
</form>
</body>
</html>
下面演示前面代码示例所使用的 XML 数据。
<?xml version="1.0" encoding="utf-8" ?>
<People>
<Person>
<Name>
<FirstName>Manoj</FirstName>
<LastName>Syamala</LastName>
</Name>
<Address>
<Street>345 Maple St.</Street>
<City>Redmond</City>
<Region>WA</Region>
<ZipCode>01434</ZipCode>
</Address>
<Job>
<Title>CEO</Title>
<Description>Develops company strategies.</Description>
</Job>
</Person>
<Person>
<Name>
<FirstName>Jared</FirstName>
<LastName>Stivers</LastName>
</Name>
<Address>
<Street>123 Elm St.</Street>
<City>Seattle</City>
<Region>WA</Region>
<ZipCode>11223</ZipCode>
</Address>
<Job>
<Title>Attorney</Title>
<Description>Reviews legal issues.</Description>
</Job>
</Person>
<Person>
<Name>
<FirstName>Karina</FirstName>
<LastName>Agerby</LastName>
</Name>
<Address>
<Street>34 Palm Avenue</Street>
<City>Renton</City>
<Region>WA</Region>
<ZipCode>63910</ZipCode>
</Address>
<Job>
<Title>IT Director</Title>
<Description>In charge of corporate network.</Description>
</Job>
</Person>
</People>
1、使用 XmlDataSource 控件转换 XML 数据
如果要在使用数据绑定控件显示 XML 数据之前转换 XML 数据,您可以为 XmlDataSource 控件提供可扩展样式表语言 (XSL) 样式表。如 XML 数据一样,您通常从使用 TransformFile 属性指定的文件加载样式表。但是,您还可以直接从使用 Transform 属性的字符串加载样式表。
要提供转换期间 XSL 样式表使用的动态 XSLT 样式表参数,您可以设置 TransformArgumentList 属性。
说明: 如果使用 XPath 属性指定 XPath 筛选表达式,发生转换后会应用该筛选器。
下面的代码示例演示一个 XmlDataSource 和绑定到它的一个 TreeView 控件。该示例使用了前面示例中的 XML 数据。该示例使用的 XSL 样式表显示在代码示例之后。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:XmlDataSource
id="PeopleDataSource"
runat="server"
TransformFile="~/App_Data/names.xsl"
DataFile="~/App_Data/people.xml" />
<asp:TreeView
id="PeopleTreeView"
runat="server"
DataSourceID="PeopleDataSource">
<DataBindings>
<asp:TreeNodeBinding DataMember="Name" TextField="#InnerText" />
</DataBindings>
</asp:TreeView>
</form>
</body>
</html>
下面演示前面代码示例所使用的 XSL 样式表。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="People">
<Names>
<xsl:apply-templates select="Person"/>
</Names>
</xsl:template>
<xsl:template match="Person">
<xsl:apply-templates select="Name"/>
</xsl:template>
<xsl:template match="Name">
<name><xsl:value-of select="LastName"/>, <xsl:value-of select="FirstName"/></name>
</xsl:template>
</xsl:stylesheet>
2、使用 XmlDataSource 控件编辑 XML 数据
XmlDataSource 控件一般用于只读数据方案,在这种方案下数据绑定控件显示 XML 数据。但是,您还可以使用 XmlDataSource 编辑 XML 数据。注意,使用其他数据源控件的自动更新、插入和删除操作不会正常工作。必须要使用 XmlDataSource 控件编写自定义代码才能对数据进行修改。
若要编辑 XML 数据,请调用 GetXmlDocument 方法检索 XmlDocument 对象,该对象是 XML 数据在内存中的表示形式。然后可以使用由 XmlDocument 对象及其 XmlNode 对象公开的对象模型,或者可以使用 XPath 表达式来操作文档中的数据。当您对内存中的 XML 数据进行更改之后,可以通过调用 Save 方法将这些数据保存到磁盘。这样会覆盖磁盘上的整个 XML 文件。
下面的列表指出了使用 XmlDataSource 控件编辑 XML 数据的某些限制:
·加载 XML 数据时必须从使用 DataFile 属性指定的 XML 文件进行加载,而不能从 Data 属性中指定的 XML 的字符串进行加载。
·在 Transform 或 TransformFile 属性中不能指定任何 XSLT 转换。
·Save 方法不会同时处理不同请求的保存操作。如果有多个用户使用 XmlDataSource 控件编辑 XML 文件,既不能保证所有用户会对相同数据进行操作,也不能保证某个用户不会覆盖另一个用户所做的更改。另外,也可能因为另一个用户正在写入 XML 文件而且文件上有专用锁,而发生无法执行 Save 操作的情况。
3、使用 XmlDataSource 控件筛选 XML 数据
默认情况下,XmlDataSource 控件公开由 DataFile 或 Data 属性指定的所有 XML 数据。但是,可以使用 XPath 表达式对数据进行筛选。使用 XPath 属性可以指定 XPath 筛选器表达式,加载 XML 数据后对 XML 数据应用任何转换时需要应用该表达式。
4、使用 XmlDataSource 控件缓存 XML 数据
XmlDataSource 控件通常与 XML 文件一起使用,每次因为请求页而打开并读取 XML 文件都会对应用程序的性能有影响。因此,默认情况下应对 XmlDataSource 控件启用缓存。通过缓存可以减低服务器的处理负荷,代价是要占用 Web 服务器的内存;多数情况下这是一种可接受的折中方案。当 EnableCaching 属性默认设置为 true 时 XmlDataSource 控件可以缓存数据。另外,可以将 CacheDuration 属性设置为该控件应缓存数据的秒数。您可以使用 CacheExpirationPolicy 微调 XmlDataSource 控件的缓存行为。
重要说明: 建议在启用了客户端模拟并且根据客户端标识检索 XmlDataSource 控件的源文件时,将 EnableCaching 属性设置为 false。如果启用了缓存,则单个用户的缓存 XML 数据会被所有用户看到,并且敏感信息可能会公开给有害源。如果 identity 配置元素的 impersonate 属性设置为 true 且对 Web 服务器上的应用程序禁用匿名标识,则说明启用了客户端模拟。
二、XmlDataSource 类
XmlDataSource 控件是向数据绑定控件提供 XML 数据的数据源控件。数据绑定控件可以使用该 XmlDataSource 控件来显示分层数据和表格数据。XmlDataSource 控件通常用于显示只读方案中的分层 XML 数据。由于 XmlDataSource 控件扩展了 HierarchicalDataSourceControl 类,因此可使用分层数据。XmlDataSource 控件也实现 IDataSource 接口,使用表格(或列表样式)数据。
说明: 出于安全目的,任何 XmlDataSource 控件属性都不以视图状态存储。由于技术上可以在客户端对视图状态的内容进行解码,因此存储有关数据结构或其内容的敏感信息可能会带来信息泄露的风险。请注意,如果需要以视图状态存储 XPath 属性之类的信息,可以在 @ Page 指令中设置 ViewStateEncryptionMode,从而启用加密来保护内容。
使用数据绑定控件时,页面开发人员使用 XmlDataSource 控件显示 XML 数据。
XmlDataSource 通常从 DataFile 属性指定的 XML 文件中加载 XML 数据。也可以使用 Data 属性,由数据源控件将 XML 数据直接存储为字符串形式。如果要在数据绑定控件显示 XML 数据前转换它,可提供可扩展样式表语言 (XSL) 样式表进行转换。和 XML 数据一样,通常从 TransformFile 属性指示的文件中加载样式表,而使用 Transform 属性将其直接存储为字符串形式。
XmlDataSource 控件通常用于由数据绑定控件显示 XML 数据的只读数据方案中。但也可以使用 XmlDataSource 控件来编辑 XML 数据。若要编辑 XML 数据,请调用 GetXmlDocument 方法来检索 XmlDataDocument 对象,该对象是 XML 数据在内存中的表示形式。可以使用由 XmlDataDocument 公开的对象模型及其所包含的 XmlNode 对象或使用 XPath 筛选表达式来操作文档中的数据。更改 XML 数据在内存中的表示形式后,可以调用 Save 方法将其保存到磁盘中。
XmlDataSource 控件的编辑功能有一些限制:
·必须从 DataFile 属性指示的 XML 文件中加载 XML 数据,而不是从 Data 属性中指定的内联 XML 中加载。
·在 Transform 或 TransformFile 属性中无法指定 XSLT 转换。
·Save 方法不处理由不同请求产生的并发保存操作。如果多个用户同时通过 XmlDataSource 编辑一个 XML 文件,则不能保证所有用户都在操作相同的数据。由于同样的并发问题,也可能导致 Save 操作失败。
对 XML 数据所执行的常用操作是将其从一个 XML 数据集转换到另一个数据集。XmlDataSource 控件支持使用 Transform 和 TransformFile 属性(在将 XML 数据传递到数据绑定控件之前,指定 XSL 样式表并应用于该 XML 数据),以及 TransformArgumentList 属性(转换期间能够提供由 XSL 样式表使用的动态 XSLT 样式表参数)进行 XML 转换。若使用 XPath 属性指定 XPath 筛选表达式,则在发生转换后应用该表达式。
默认情况下,XmlDataSource 控件加载 XML 文件中由 DataFile 属性标识的所有 XML 数据,或在 Data 属性中找到的所有内联数据,但是,您可以使用 XPath 表达式来筛选这些数据。XPath 属性支持 XPath 语法筛选器,可在加载和转换 XML 数据后应用该筛选器。
出于提高性能的目的,默认情况下会为 XmlDataSource 控件启用缓存。每次在页请求的服务器中打开和读取 XML 文件都可能降低应用程序的性能。缓存通过消耗 Web 服务器的内存而减少服务器的处理工作量;多数情况下,这是一个不错的折衷方法。如果将 EnableCaching 属性设置为 true,且将 CacheDuration 属性设置为缓存失效前在缓存中存储数据的秒数,XmlDataSource 将自动缓存数据。可以使用 CacheExpirationPolicy 进一步微调数据源控件的缓存行为。
功能 | 说明 |
排序 | XmlDataSource 控件不支持。 |
筛选 | 通过使用合适的 XPath 表达式,即可以使用 XPath 属性来筛选 XML 数据。 |
分页 | XmlDataSource 控件不支持。 |
更新 | 通过直接操作 XmlDataDocument,然后调用 Save 方法来支持。 |
删除 | 通过直接操作 XmlDataDocument,然后调用 Save 方法来支持。 |
插入 | 通过直接操作 XmlDataDocument,然后调用 Save 方法来支持。 |
缓存 | 默认情况下启用,且将 CacheDuration 属性设置为 0(无限),将 CacheExpirationPolicy 属性设置为 Absolute。 |
XmlDataSource 控件支持显示分层数据的数据绑定控件和显示表格数据的控件,因此,数据源控件支持其基础 XML 数据中的多种类型的数据源视图对象。与显示表格数据的数据绑定控件一起使用时,XmlDataSource 控件将检索单个命名 XmlDataSourceView 对象。GetViewNames 方法标识此单个命名视图。与显示分层数据的数据绑定控件一起使用时,XmlDataSource 控件将为传递到 GetHierarchicalView 方法的任意唯一分层路径检索 XmlHierarchicalDataSourceView。
示例
本节包含两个代码示例。第一个代码示例演示如何将 XmlDataSource 控件和 TreeView 控件一起使用,以显示示例 XML 文件中的 XML 数据。第二个示例演示如何将 XmlDataSource 控件与模板化 Repeater 控件一起使用,以显示 XML 数据。
1、下面的代码示例演示如何将 XmlDataSource 控件与 TreeView 控件一起使用,以显示 XML 数据。XmlDataSource 从 DataFile 属性标识的 XML 文件中加载 XML 数据。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:xmldatasource
id="XmlDataSource1"
runat="server"
datafile="books.xml" />
<!- TreeView uses hierachical data, so the
XmlDataSource uses an XmlHierarchicalDataSourceView
when a TreeView is bound to it. -->
<asp:TreeView
id="TreeView1"
runat="server"
datasourceid="XmlDataSource1">
<databindings>
<asp:treenodebinding datamember="book" textfield="title"/>
</databindings>
</asp:TreeView>
</form>
</body>
</html>
该代码示例中的 XML 文件包括以下数据:
<books>
<computerbooks>
<book title="Secrets of Silicon Valley" author="Sheryl Hunter"/>
<book title="Straight Talk About Computers" author="Dean Straight"/>
<book title="You Can Combat Computer Stress!" author="Marjorie Green"/>
</computerbooks>
<cookbooks>
<book title="Silicon Valley Gastronomic Treats" author="Innes del Castill"/>
</cookbooks>
</books>
2、下面的代码示例演示如何将 XmlDataSource 控件与模板化 Repeater 控件一起使用以显示 XML 数据。Repeater 控件使用 XPath 数据绑定表达式绑定到 XmlDataSource 所表示的 XML 文档中的数据项。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>Order</title>
</head>
<body>
<form id="form1" runat="server">
<asp:XmlDataSource
runat="server"
id="XmlDataSource1"
XPath="orders/order"
DataFile="order.xml" />
<asp:Repeater ID="Repeater1"
runat="server"
DataSourceID="XmlDataSource1">
<ItemTemplate>
<h2>Order</h2>
<table>
<tr>
<td>Customer</td>
<td><%#XPath("customer/@id")%></td>
<td><%#XPath("customername/firstn")%></td>
<td><%#XPath("customername/lastn")%></td>
</tr>
<tr>
<td>Ship To</td>
<td><%#XPath("shipaddress/address1")%></font></td>
<td><%#XPath("shipaddress/city")%></td>
<td><%#XPath("shipaddress/state")%>,
<%#XPath("shipaddress/zip")%></td>
</tr>
</table>
<h3>Order Summary</h3>
<asp:Repeater ID="Repeater2"
DataSource='<%#XPathSelect("summary/item")%>'
runat="server">
<ItemTemplate>
<b><%#XPath("@dept")%></b> -
<%#XPath(".")%><br />
</ItemTemplate>
</asp:Repeater>
<hr />
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
该代码示例中的 XML 文件包括以下数据:
<?xml version="1.0" encoding="iso-8859-1"?>
<orders>
<order>
<customer id="12345" />
<customername>
<firstn>John</firstn>
<lastn>Smith</lastn>
</customername>
<transaction id="12345" />
<shipaddress>
<address1>1234 Tenth Avenue</address1>
<city>Bellevue</city>
<state>Washington</state>
<zip>98001</zip>
</shipaddress>
<summary>
<item dept="tools">screwdriver</item>
<item dept="tools">hammer</item>
<item dept="plumbing">fixture</item>
</summary>
</order>
</orders>