Gridview绑定到XML

jpk*_*ala 4 c# xml asp.net gridview

我试图创建一个简单的网格视图绑定到一个简单的xml文档,但我必须丢失一些东西,因为我一直收到错误消息:

ID为'GridView1'的GridView的数据源没有任何属性或属性可用于生成列.确保您的数据源包含内容.

<asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1">
    <Columns>
        <asp:BoundField DataField="id" HeaderText="ID" SortExpression="id" />
    </Columns>
</asp:GridView>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" 
    DataFile="Notifications.xml" XPath="/data/node"></asp:XmlDataSource>
Run Code Online (Sandbox Code Playgroud)

XML

<?xml version="1.0" encoding="utf-8" ?>
<data>
  <node>
    <id>1096</id>
    <name>About Us</name>
    <date>21/12/2009 17:03:43</date>
    <user id="1">writer</user>
  </node>
  <node>
    <id>1099</id>
    <name>News</name>
    <date>21/12/2009 17:03:47</date>
    <user id="1">writer</user>
  </node>
  <node>
    <id>1098</id>
    <name>Another page</name>
    <date>21/12/2009 17:03:52</date>
    <user id="1">writer</user>
  </node>
</data>
Run Code Online (Sandbox Code Playgroud)

是不是我的xpath错了,或者我在这里犯了一些根本错误的东西?

Eil*_*lon 7

有很多方法可以让它发挥作用:

  1. 使用Brian的解决方案,即重写XML以使用属性而不是子节点.
  2. 使用XSLT转换将子节点动态转换为属性.对于可以执行该操作的XSLT,请参阅此SO问题.
  3. 将XML数据加载到DataSet中,DataSet在内部执行此转换.

这是一个如何做#3的例子:

DataSet ds = new DataSet();
ds.ReadXml(MapPath("~/App_Data/mydata.xml"));
GridView1.DataSource = ds;
GridView1.DataBind();
Run Code Online (Sandbox Code Playgroud)

最后一种方法的局限性在于,您不会像使用数据源控件那样获得自动数据绑定.但是,由于XmlDataSource无论如何都是只读控件,因此不一定是严重的限制.