如何使用asp:XmlDataSource和XPath解析XML-feed

时间:2009-08-04 15:36:11

标签: c# asp.net xml data-binding

我正在尝试通过asp:XmlDataSource使用XML_feed列出asp:GridView中的空缺。这个应该有点简单,但我错过了我的XPath表达式..

这是我想要实现的一个简短例子(列出空缺职位):

<asp:XmlDataSource ID="XMLsource" DataFile="http://demo.easycruit.com/export/xml/vacancy/list.xml" XPath="VacancyList/Vacancy" runat="server"/>
<asp:GridView DataSourceID="XMLsource" AutoGenerateColumns="False" runat="server">      
<Columns>
        <asp:TemplateField>
            <HeaderTemplate>Title</HeaderTemplate>
            <ItemTemplate><%# XPath( "Version/Title" ) %></ItemTemplate>                
    </asp:TemplateField>            
</Columns>
</asp:GridView>

两个控制器在代码隐藏中都有DataBind()。所以,如果有人知道为什么这不起作用......:)

1 个答案:

答案 0 :(得分:1)

如果你看一下你的XML(只是前几行):

<VacancyList generated="2009-08-04T18:43:17" 
             xmlns="urn:EasyCruit" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://www.easycruit.com/dtd/vacancy-list.xsd">
  <Vacancy id="82034" date_start="2007-04-17" date_end="2009-12-22" 
           reference_number="CDP-GR3">
    <Versions>
      <Version language="fr">
        <Title>Chef de produit (H/F)</Title>
        <TitleHeading/>

您将数据网格绑定到<Vacancy>元素列表 - 到目前为止很好。

但是在你的网格中,你引用了:<%# XPath( "Version/Title" ) %>

这不起作用,因为<Vacancy>没有'/ inside it - these elements are within a`集合.....

所以你需要在ItemTemplate中引用的是:

<%# XPath( "Versions/Version[@language='fr']/Title" ) %>

这应该有效。

<强>更新
ASP.NET 2.0 XmlDataSource似乎还有一个问题,即无法处理默认的XML命名空间: - (

这就是你的XML中的这一行:

<VacancyList ........
             xmlns="urn:EasyCruit" 

请在此处参阅此博客文章主题:http://jasonf-blog.blogspot.com/2006/08/xmldatasource-xpath-workaround-for.html

你可以做两件事来解决这个问题:

  • 使用XSLT转换去掉默认命名空间,以便XmlDataSource可以处理数据
  • 从代码中的URL加载数据,并将其绑定到代码隐藏
  • 中的GridView

更新2: 剥离XML名称空间的方法看起来效果很好--Bill Evjen提出了这种方法here

如果将帖子中的XSLT文件保存到网站项目中名为“StripNamespaces.xslt”的文件中,如果将asp:XmlDataSource更改为:

,则应获取数据
<asp:XmlDataSource ID="XMLsource" runat="server"
            DataFile="http://demo.easycruit.com/export/xml/vacancy/list.xml" 
            TransformFile="~/StripNamespaces.xslt"
            XPath="VacancyList/Vacancy" />

请注意新的“TransformFile”设置 - 这必须引用该XSLT文件。有了这个,我现在可以在GridView中显示数据。

马克