Gridview绑定到XML

时间:2010-01-01 14:59:29

标签: c# asp.net xml gridview

我正在尝试创建一个绑定到简单xml文档的简单网格视图但我必须遗漏一些东西,因为我不断收到错误消息:

  

带有id的GridView的数据源   'GridView1'没有   属性或属性来自   生成列。确保你的   数据源有内容。

代码

<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>

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>

这可能是我的xpath错了还是我在这里犯了一些根本错误的东西?

4 个答案:

答案 0 :(得分:6)

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

  1. 使用Brian的解决方案,即重写XML以使用属性而不是子节点。
  2. 使用XSLT转换将子节点动态转换为属性。有关可以执行该操作的XSLT,请参阅this SO question
  3. 将XML数据加载到DataSet中,该DataSet在内部执行此转换。
  4. 这是一个如何做#3的例子:

    DataSet ds = new DataSet();
    ds.ReadXml(MapPath("~/App_Data/mydata.xml"));
    GridView1.DataSource = ds;
    GridView1.DataBind();
    

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

答案 1 :(得分:3)

XmlDataSource使用属性,而不是子实体。你需要这样做:

<node id="1096" name="About Us" ../>

而不是使用子元素。不幸的是这是这样的;我真的希望它可以与替代方案一起工作;我更喜欢这种方法。

答案 2 :(得分:0)

尝试将xpath更改为

看起来像XPath="data/node"

答案 3 :(得分:0)

动态数据绑定到XML文档

如果您的Xml具有更多信息,您将能够更轻松地遍历结构,因为它更容易识别您要查找的确切节点。

我们有一个Web服务,它以行/列结构返回XML(类似于上面的数据示例)

为了速度,我复制/粘贴了我们的解决方案,但是你应该得到要点,并且能够破解它来做你的事情。

<response xmlns="">
  <method name="ExecuteMethod">
  <message>Query Successful</message>
  <summary success="true" rowcount="2" />
  <row>
    <column name="ID"><![CDATA[SomeData]]></column>
    <column name="NHS_NO"><![CDATA[SomeData]]></column>
    <column name="HOSPITALNUMBER"><![CDATA[SomeData]]></column>
    <column name="SURNAME"><![CDATA[SomeData]]></column>
    <column name="FIRST_FORENAME"><![CDATA[SomeData]]></column>
    <column name="TITLE"><![CDATA[SomeData]]></column>
    <column name="SEX"><![CDATA[SomeData]]></column>
    <column name="DOB">SomeData</column>
    <column name="ADDRESS"><![CDATA[SomeData]]></column>
    <column name="POSTCODE"><![CDATA[SomeData]]></column>
    <column name="DOD" />
  </row>
  <row>
    <column name="ID"><![CDATA[SomeData]]></column>
    <column name="NHS_NO"><![CDATA[SomeData]]></column>
    <column name="HOSPITALNUMBER"><![CDATA[SomeData]]></column>
    <column name="SURNAME"><![CDATA[SomeData]]></column>
    <column name="FIRST_FORENAME"><![CDATA[SomeData]]></column>
    <column name="TITLE"><![CDATA[SomeData]]></column>
    <column name="SEX"><![CDATA[SomeData]]></column>
    <column name="DOB">SomeData</column>
    <column name="ADDRESS"><![CDATA[SomeData]]></column>
    <column name="POSTCODE"><![CDATA[SomeData]]></column>
    <column name="DOD" />
  </row>
</method>
</response> 

这是c#实现

  • 我们将列名称输出以传递给Gridviews.Datakey名称数组
  • 中的数据
  • 我们循环遍历行,在我们进行时将每行添加到数据集
  • 我们将gridviews datasounce设置为数据集
  • 我们绑定()

下面的示例中有一些css和控件实例,便于您复制/粘贴。

//In Code In Front...

Table.DataGridView{float:left; width:100%;}
Table.DataGridView tr{}
Table.DataGridView th{ background-color:Gray; font-weight:bold; color:White;}
Table.DataGridView td{ background-color:White; color:Black; font-weight:normal;}

<asp:GridView ID="DataGridView" runat="server" CssClass="DataGridView" GridLines="Both" Visible="false" />


//In Code Behind...

XmlNode myXmlNodeObject = myXmlDocService.GetData(_xmlDataString);

    //Bind To GridView

    //Create a DataSet To Bind To
    DataSet ds = new DataSet();
    ds.Tables.Add("XmlDataSet");

    //Get Column Names as String Array
    XmlDocument XMLDoc = new XmlDocument();
    XMLDoc.LoadXml("<result>" +myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).ParentNode.InnerXml + "</result>"); //Get Row/Columns
    int colCount = myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column").Count;
    string[] ColumnNameArray = new string[colCount];
    int iterator = 0;
    foreach(XmlNode node in myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column"))
    {
        ColumnNameArray.SetValue(node.Attributes["name"].Value ,iterator);
        ds.Tables["XmlDataSet"].Columns.Add(node.Attributes["name"].Value); //Create individual columns in the dataset
        iterator++;
    }

    //Get Data Row By Row to populate the DataSet.Rows
    foreach(XmlNode RowNode in XMLDoc.ChildNodes.Item(0).SelectNodes("row"))
    {
        string[] rowArray = new string[colCount]; 
        int iterator2 = 0;
        foreach(XmlNode ColumnNode in RowNode.ChildNodes)
        {
            rowArray.SetValue(ColumnNode.InnerText, iterator2);
            iterator2++;
        }
        ds.Tables["XmlDataSet"].Rows.Add(rowArray);
    }

    DataGridView.DataSource = ds.Tables["XmlDataSet"];
    DataGridView.DataKeyNames = ColumnNameArray;
    DataGridView.DataBind();
    DataGridView.Visible = true;