我正在尝试创建一个绑定到简单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错了还是我在这里犯了一些根本错误的东西?
答案 0 :(得分:6)
有很多方法可以让它发挥作用:
这是一个如何做#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#实现
下面的示例中有一些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;