随笔-5  评论-5  文章-0  trackbacks-0

[翻译]Scott Mitchell谈DataSource系列之四 使用XmlDataSource控件访问XML数据

 

使用XmlDataSource控件访问XML数据

Accessing and Updating Data in ASP.NET 2.0: Retrieving XML Data with XmlDataSource Control
By Scott Mitchell

原文地址:http:/aspnet.4guysfromrolla.com/articles/092706-1.aspx


序:

ASP.NET 2.0中新近引入了一系列的用来访问和更新数据的WEB控件。这些控件的出现使得网页开发人员可以以声明式的编程方式访问并对数据进行操作,摈弃了原来那种编写数据访问代码的方式。本篇文章是我所写的关于ASP.NET 2.0中最新的数据源控件文章系列专题中的一个。

·数据源控件的基础知识探究数据源控件的基本概念以及它的优点,并且与ASP.NET 1.x平台中的数据访问技术做了一个初步的比较。

·访问数据库中的数据展示如何通过SqlDataSource以及AccessDataSource控件从一个关系形数据库中查询并获得数据。

·使用参数对数据库数据进行筛选学习如何使用硬编码的参数值以及QueryString查询字符串传递来的参数值,或者是其他WEB控件传递的值,Session会话变量值等参数进行筛选,来获取一个数据库中的数据的子集。

·使用XmlDataSource控件检索XML数据了解如何访问位于远程以及本地的XML数据并且将这些数据显示于WEB控件中。

·创建自定义的参数控件学习如何创建自定义的、声明式的参数控件,该控件基于数据源控件的参数集合。

·了解数据源控件的事件机制探究数据源控件的整个生命周期中,如何触发事件。

·声明式缓存数据 – 学习如何通过设置数据源控件的几个属性实现数据缓存.

·使用数据源控件编程访问数据使用 SqlDataSource 和 AccessDataSource控件编程实现对数据的增删改查.

·插入数据 – 使用SqlDataSource 控件新建数据;同时也了解如何检索到新增记录的标识列的值.

·删除数据 -  使用SqlDataSource控件删除一条数据;同时了解如何编程实现取消删除操作.

·更新操作-使用SqlDataSource控件学习更新操作;同时了解 GridView的基于网页的更新界面.

·自定义编辑界面学习自定义GridView控件的列来实现一个带有输入验证的交互性用户界面.

介绍
ASP.NET 2.0
通过引入声明式数据源控件及其他Web数据控件后,极大简化了数据处理过程.在本系列第二篇文章访问数据库中的数据,我们了解到使用SqlDataSource控件从关系型数据库中获取数据, 然后数据可以绑定到Web数据控件(比如GridView, DetailsView, FormView, DataList, Repeater,等等).那么XML数据呢?答案是使用XmlDataSource 数据源控件,它可以简单地访问(以及显示)XML数据.

XmlDataSource 控件无须手写代码,简单实现对XML数据的访问、过滤以及转换. 而且, ASP.NET 2.0中对其新增的XPath()和XPathSelect()数据绑定方法使显示特定XML数据或者绑定整个XML结点集合的过程更加简化了. 并且XML数据的访问不仅可以从本地文件进行,而且也可以从指定的URL地址自动下载.本篇我将介绍如何使用XmlDataSource数据源控件以及它的XPath()XPathSelect()方法实现数据的绑定以及各种数据控件中对XML数据的显示. 加油!

XmlDataSource 概论
XmlDataSource
控件的作用就是检索XML数据, 然后编程访问或者将其绑定到其他控件. ASP.NET页面上使用XmlDataSource数据源控件访问XML数据, 首先要从工具箱中拖放该控件到设计视图 (XmlDataSource在工具箱的数据区段). XmlDataSource的智能标记中,点击配置数据源”("Configure Data Source"),打开配置数据源向导(如下图).根据向导,你可以设置XmlDataSource控件的以下三个最重要的属性:

  • DataFile指定了要访问的XML文件. 这个文件可以是本地的,比如~/App_Data/XMLFile.xml, 也可以是远程文件,比如http://msdn.microsoft.com/rss.xml.
  • TransformFile - XML 文件可以经 (XSL)进行转换.在操作DataFile属性指定的XML文件中的数据之前,如果要转换XML内容,请为该属性指定一个可扩展样式表语言文件. 关于可扩展样式表语言的详细信息, 请参看W3 Schools中的可扩展样式表语言入.
  • XPath – Xpath是过滤XML文件内容的语法,它返回一个特定的值或结点集合. 如果要处理XML文件中特定的数据,请为该属性指定一个XPath语句以过滤返回的结果集. 关于XPath详细信息,请参看 XPath入门.

 

如果没有XML文件和可扩展样式表语言(XSLT)文件,也可以通过XmlDataSource DataTransform属性指定原始XML数据或者可扩展样式表语言文件. 这两个属性不能在向导中设置,必须在属性面板中设定. (设计视图中转移焦点至XmlDataSource控件,按下F4.)

XmlDataSource控件绑定到web数据控件并访问特定的XML数据
配置XmlDataSource完成后,在页面中添加一个web数据控件并设置它的DataSourceID属性为XmlDataSourceID属性值(通过该数据控件的智能标记,可以很简单地在下拉列表框中选择). ASP.NET 2.0 在访问XML数据特定值或结点集合方面提供了两个新的绑定方法:

  • XPath("xpath")访问一个特定的值.要获取某个结点的文本值,只需简单地将xpath属性指定为该结点;属性结点前面要加上个前缀@.
  • XPathSelect("xpath")返回一个结点集合.可以将结点集合绑定到嵌套的数据控件上.

有一点必须注意,这些绑定语句一定要写在template. 一些控件比如 GridView DetailsView, 是由其他控件元素组成的(比如BoundField, CheckBoxField), 在每个要显示的字段上都要使用TemplateFields.

1:使用DataList显示远程RSS 2.0
RSS(Really Simple Syndication),
提供XML格式的聚合访问. 聚合内容可以集成到其他站点,或者可以通过特定的桌面应用程序访问. 现在许多网站都提供聚合访问. 比如, 最近的4Guys文章的聚合地址是http://aspnet.4guysfromrolla.com/rss/rss.aspx.

一个标准的RSS聚合源格式类似下面的例子:

<rss version="2.0">
  <channel>
    <title>Scott的新闻</title>
    <link>http://www.example.com</link>
    <description>来自Scott的新闻.</description>

    <item>
      <title>锻炼减肥</title>
      <link>http://www.example.com/news.aspx?Id=4</link>
      <description>
        一些医生最近在研究天气对于锻炼的影响.研究结果将在2009年公布.
      </description>
      <pubDate>Wed, 20 Sep 2006 03:15:00 GMT</pubDate>
    </item>

    <item>
      <title>中东依然战局混乱</title>
      <link>http://www.example.com/news.aspx?Id=2</link>
      <description>
        中东地区依然战火连天.交战双方是不是该握手言和了?
      </description>
      <pubDate>Tue, 19 Sep 2006 06:31:15 GMT</pubDate>
    </item>

    ...
  </channel>
</rss>

简单地说,一个RSS 源是由一系列<item>组成的,每个元素代表了最近的聚合内容. 关于RSS源以及聚合内容的更多信息,请访问 Syndicating Your Web Site's Content with RSS; 以及RSS 2.0 详述.

在这个例子中,我们是要把这一系列元素绑定到DataList.因此,要把XmlDataSource控件的DataFile属性设为该远程RSS源的url地址(比如http://aspnet.4guysfromrolla.com/rss/rss.aspx) ,并且要把XPath属性设为/rss/channel/item. 这里XPath语句指示XmlDataSource控件返回<item>元素的集合, DataList 控件将会显示每条元素的数据.

下一步, 添加一个DataList并将它的ItemTemplate配置为显示每个结点内容的<title>, <description>, <pubDate>元素值,最后添加一个访问内容的链接(使用<link>元素的值). 代码应该和以下大致相同:

<asp:DataList ID="FeedList" runat="server" DataSourceID="RSSFeedDataSource">
    <ItemTemplate>
        <h4>
          <a href='<%# XPath("link") %>'>
            <asp:Label runat="server" ID="TitleLabel" Text='<%# XPath("title") %>'></asp:Label>
          </a>
        </h4>
        <p>
          <i>Published <%#XPath("pubDate")%></i>
        </p>
        <p>
          <asp:Label runat="server" ID="DescriptionLabel" Text='<%# XPath("description") %>'></asp:Label>
        </p>
        <p>
          [<a href='<%# XPath("link") %>'>Read More</a>]
        </p>
        <br />
    </ItemTemplate>
</asp:DataList>

这里要注意<# XPath("xpath") %>语法是如何从DataList中的当前结点获取特定值的. 因为DataList是被一系列<item>结点绑定, <%# XPath("link") %>将会返回当前<item>结点的<link>元素值.

搞定ItemTemplate, 在浏览器中预览一下效果.下图应该就是读取4Guys 网站RSS源的截图.


 

一个更简单的查看RSS聚合的方法就是使用我写的免费、开源的工具RssFeed control! 具体查看 A Custom ASP.NET Server Control for Displaying RSS Feeds...

2: 将结点集合绑定到一个嵌套的数据控件
XPath("xpath")方法允许绑定XML文件中特定的结点,可是如果要绑定整个结点集合到一个嵌套数据控件呢? XPathSelect("xpath")方法便提供这个功能.为了更形象地说明这个方法,我创建了一个例子显示用户购物的收据,而用户购物清单细节则是用XML格式来输出.在本文最后的下载文件中App_Data 文件夹下你能看见一个xml文件PO.xml.这个xml文件(其基本结构可查看示例XML文件)包含了一个用户的定单数据,它的结点如下:

<Order orderDate="orderDate">
  <Customer>
    <Name>name</Name>
    <Cardnum>credit card number</Cardnum>
  </Customer>

  <Manifest>
    <Item>
      <ID>ID</ID>
      <Title>title</Title>
      <Quantity>qty</Quantity>
      <UnitPrice>price</UnitPrice>
    </Item>
    <Item>
      <ID>ID</ID>
      <Title>title</Title>
      <Quantity>qty</Quantity>
      <UnitPrice>price</UnitPrice>
    </Item>
    ...
  </Manifest>

  <Receipt>
    <Subtotal>subtotal</Subtotal>
    <Tax>tax</Tax>
    <Total>grand total</Total>
  </Receipt>
</Order>

显示该收据,就是显示客户的信息,收款小计,税率,总计以及购物列表.因为定单中可能有一系列的小项, 我们可以使用嵌套的数据控件来显示一系列<Item>结点的内容.

添加一个FormView显示客户和单价的详细信息,将它绑定到一个XmlDataSource控件,该控件的DataFile属性设为~/App_Data/PO.xml文件.不要设置XPath属性.下一步,FormView中的ItemTemplate, 使用XPath("xpath")方法显示客户和单价的详细信息:

<asp:FormView ID="Receipt" runat="server" DataSourceID="PODataSource">
  <ItemTemplate>
    <p><h3>RECEIPT</h3></p>
    <p><b>Order Date:</b> <asp:Label runat="server" ID="OrderDateLabel" Text='<%#XPath("/Order/@orderDate")%>'></asp:Label></p>
    <p>
      <b><u>Customer Details:</u></b><br />
      <b>Name:</b> <asp:Label runat="server" ID="NameLabel" Text='<%#XPath("/Order/Customer/Name")%>'></asp:Label><br />
      <b>Card #:</b> <asp:Label runat="server" ID="CardNumberLabel" Text='<%#XPath("/Order/Customer/Cardnum")%>'></asp:Label><br />
    </p>

    ... <Item>项由GridView在此处显示! ...

    <p style="border-bottom:solid 1px black;">
      <b>Subtotal:</b> <asp:Label runat="server" ID="SubtotalLabel" Text='<%#XPath("/Order/Receipt/Subtotal")%>'></asp:Label><br />
      <b>Tax:</b> <asp:Label runat="server" ID="TaxLabel" Text='<%#XPath("/Order/Receipt/Tax")%>'></asp:Label><br />
    </p>
    <p>
      <b>Total:</b> <asp:Label runat="server" ID="TotalLabel" Text='<%#XPath("/Order/Receipt/Total")%>'></asp:Label><br />
    </p>
  </ItemTemplate>
</asp:FormView>

因为xmlDataSource控件的XPath属性没有设置, FormView绑定的就是<Order>结点.因此,要从<Customer>中取得<Name>元素,就要使用XPath语句/Order/Customer/Name”. 要获取一个属性值:orderDate<Order>元素中的一个属性就要在该属性前加上前缀@ (比如, /Order/@orderDate).

以上绑定语法只是将客户和单价信息显示在FormView, 我们还需要显示定单相关的<Item>.所以就要在FormViewItemTemplate字段中添加一个GridView控件并将它的DataSource属性设为<Item>结点集合,这里需要如下语法: <asp:GridView runat="server" ... DataSource='<# XPathSelect("/Order/Manifest/Item") %>' ...>. 然后, GridView<Columns>字段,为每个数据添加一个TemplateField来显示细节:

<asp:FormView ID="Receipt" runat="server" DataSourceID="PODataSource">
  <ItemTemplate>
    ...

    <asp:GridView runat="server" ID="ItemsSummary" DataSource='<%# XPathSelect("/Order/Manifest/Item") %>'
          AutoGenerateColumns="False">
      <Columns>
        <asp:TemplateField HeaderText="Title">
          <ItemTemplate>
            <asp:Label runat="server" ID="NameLabel" Text='<%#XPath("Title")%>'></asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Qty" ItemStyle-HorizontalAlign="Right">
          <ItemTemplate>
            <asp:Label runat="server" ID="QuantityLabel" Text='<%#XPath("Quantity")%>'></asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Unit Price" ItemStyle-HorizontalAlign="Right">
          <ItemTemplate>
            <asp:Label runat="server" ID="UnitPriceLabel" Text='<%#XPath("UnitPrice")%>'></asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>

    ...
  </ItemTemplate>
</asp:FormView>


小结

ASP.NET 2.0
提供一系列不同的数据控件来处理不同类型的数据.比如SqlDataSource控件专门处理关系型数据库的数据. 本文中我们可以看到,处理XML数据,便可以使用XmlDataSource控件. XmlDataSource数据源控件可以处理本地或远程的XML数据, 或者直接将原始的XML数据指派给该控件的Data属性. 它还有两个可选的属性TransformFileXPath,分别设置对XML数据内容的转换和过滤.

 

配置完XmlDataSource 控件后,可以将数据绑定到其他web数据控件. XmlDataSource控件返回的XML数据, 可以使用XPath("xpath")属性获取单行单列结果集,或是使用XPathSelect("xpath")属性来获取结点集合. 请下载代码示例,参看上面两段代码的完整文件.

祝编程愉快!

· By Scott Mitchell


其他相关文章:

· Simplified and Extended Data Binding Syntax in ASP.NET 2.0

· The XmlDataSource Control QuickStarts

· The XML and XmlDataSource Control Forum @ ASP.NET Forums

附件

· 下载本文代码 (ZIP格式)

posted on 2007-08-21 12:33 小白杨 阅读(916) 评论(2) 编辑 收藏

评论:
#1楼 2008-04-10 14:46 | Willson      
翻译的真好,而且页面布局看着也很舒服。

博主辛苦了。

 回复 引用 查看   
#2楼 2008-05-17 18:27 | fancy[未注册用户]
想请教一下,如果xml源文件带有命名空间呢,

<xmlns:ns0 :http://temp.org>
<ns:root>
........
这种情况该怎么写xpath呢?
期待您的回复

 回复 引用