XmlDataSource Web 服务器控件概述

更新:2007 年 11 月

XmlDataSource 控件使得 XML 数据可用于数据绑定控件。可以使用该控件同时显示分层数据和表格数据。在只读情况下,XmlDataSource 控件通常用于显示分层 XML 数据。

本主题包括:

  • 背景

  • 代码示例

  • 类参考

背景

XmlDataSource 从使用 DataFile 属性指定的 XML 文件加载 XML 数据。另外,还可以从使用 Data 属性的字符串加载 XML 数据。

XmlDataSource 控件将 XML 元素的属性公开为可绑定数据的字段。如果要绑定非属性的值,则可以使用可扩展样式表语言 (XSL) 样式表指定转换。在 FormViewGridView 等控件模板中,您还可以使用 XPath 数据绑定功能将模板中的控件绑定到 XML 数据。有关使用 XPath 表达式的信息,请参见 将表格控件绑定到 XmlDataSource 控件

下面的代码示例演示一个 XmlDataSource 和绑定到它的一个 TreeView 控件。源 XML 显示在代码示例之后。

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <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>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <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>

使用 XmlDataSource 控件转换 XML 数据

如果要在使用数据绑定控件显示 XML 数据之前转换 XML 数据,您可以为 XmlDataSource 控件提供可扩展样式表语言 (XSL) 样式表。如 XML 数据一样,您通常从使用 TransformFile 属性指定的文件加载样式表。但是,您还可以直接从使用 Transform 属性的字符串加载样式表。

要提供转换期间 XSL 样式表使用的动态 XSLT 样式表参数,您可以设置 TransformArgumentList 属性。

494y92bs.alert_note(zh-cn,VS.90).gif说明:

如果使用 XPath 属性指定 XPath 筛选表达式,发生转换后会应用该筛选器。

下面的代码示例演示一个 XmlDataSource 和绑定到它的一个 TreeView 控件。该示例使用了前面示例中的 XML 数据。该示例使用的 XSL 样式表显示在代码示例之后。

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <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>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <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>

使用 XmlDataSource 控件编辑 XML 数据

XmlDataSource 控件一般用于只读数据方案,在这种方案下数据绑定控件显示 XML 数据。但是,您还可以使用 XmlDataSource 编辑 XML 数据。注意,使用其他数据源控件的自动更新、插入和删除操作不会正常工作。必须要使用 XmlDataSource 控件编写自定义代码才能对数据进行修改。

若要编辑 XML 数据,请调用 GetXmlDocument 方法检索 XmlDocument 对象,该对象是 XML 数据在内存中的表示形式。然后可以使用由 XmlDocument 对象及其 XmlNode 对象公开的对象模型,或者可以使用 XPath 表达式来操作文档中的数据。当您对内存中的 XML 数据进行更改之后,可以通过调用 Save 方法将这些数据保存到磁盘。这样会覆盖磁盘上的整个 XML 文件。

下面的列表指出了使用 XmlDataSource 控件编辑 XML 数据的某些限制:

  • 加载 XML 数据时必须从使用 DataFile 属性指定的 XML 文件进行加载,而不能从 Data 属性中指定的 XML 的字符串进行加载。

  • TransformTransformFile 属性中不能指定任何 XSLT 转换。

  • Save 方法不会同时处理不同请求的保存操作。如果有多个用户使用 XmlDataSource 控件编辑 XML 文件,既不能保证所有用户会对相同数据进行操作,也不能保证某个用户不会覆盖另一个用户所做的更改。另外,也可能因为另一个用户正在写入 XML 文件而且文件上有专用锁,而发生无法执行 Save 操作的情况。

使用 XmlDataSource 控件筛选 XML 数据

默认情况下,XmlDataSource 控件公开由 DataFileData 属性指定的所有 XML 数据。但是,可以使用 XPath 表达式对数据进行筛选。使用 XPath 属性可以指定 XPath 筛选器表达式,加载 XML 数据后对 XML 数据应用任何转换时需要应用该表达式。有关示例,请参见 使用 XmlDataSource 控件筛选数据

使用 XmlDataSource 控件缓存 XML 数据

XmlDataSource 控件通常与 XML 文件一起使用,每次因为请求页而打开并读取 XML 文件都会对应用程序的性能有影响。因此,默认情况下应对 XmlDataSource 控件启用缓存。通过缓存可以减低服务器的处理负荷,代价是要占用 Web 服务器的内存;多数情况下这是一种可接受的折中方案。当 EnableCaching 属性默认设置为 true 时 XmlDataSource 控件可以缓存数据。.另外,可以将 CacheDuration 属性设置为该控件应缓存数据的秒数。您可以使用 CacheExpirationPolicy 微调 XmlDataSource 控件的缓存行为。

494y92bs.alert_caution(zh-cn,VS.90).gif重要说明:

建议在启用了客户端模拟并且根据客户端标识检索 XmlDataSource 控件的源文件时,将 EnableCaching 属性设置为 false。如果启用了缓存,则单个用户的缓存 XML 数据会被所有用户看到,并且敏感信息可能会公开给有害源。如果 identity 配置元素的 impersonate 属性设置为 true 且对 Web 服务器上的应用程序禁用匿名标识,则说明启用了客户端模拟。

返回页首

代码示例

使用 XmlDataSource 控件筛选数据

将表格控件绑定到 XmlDataSource 控件

演练:创建网页以显示 XML 数据

返回页首

类参考

下表列出了与 XmlDataSource 控件相关的关键类。

成员

说明

XmlDataSource

控件的主类。

返回页首

请参见

参考

XML Web 服务器控件概述