使用ReadXML()将XML子节点绑定到DataList时出现问题
本文关键字:DataList 问题 绑定 子节点 ReadXML XML 使用 | 更新日期: 2023-09-27 18:07:09
我试图将一个ASP DataList控件与从XML文件返回的值绑定。有点独特的是,我没有从文件中加载XML,而是使用XMLTextReader()将其作为字符串加载。这样做的原因是XML将根据从数据库读取的值构建。下面的代码接受(在本例中是硬编码的)XML字符串,将其添加到DataSet,然后绑定DataList控件…
StringBuilder xml = new StringBuilder();
xml.Append("<product>");
xml.Append("<sku>241</sku>");
xml.Append("<prodID>2SIDED</prodID>");
xml.Append("<name>Product Name</name>");
xml.Append("<price>6.99</price>");
xml.Append("<description>Product Description</description>");
xml.Append("<standalone>1</standalone>");
xml.Append("<sellable>1</sellable>");
xml.Append("<product-type>10</product-type>");
xml.Append("<customization>");
xml.Append("<option1></option1>");
xml.Append("<option2></option2>");
xml.Append("<option3></option3>");
xml.Append("</customization>");
xml.Append("</product>");
using (XmlTextReader tr = new XmlTextReader(new StringReader(xml.ToString())))
{
var document = XElement.Load(tr);
string source = document.ToString();
DataSet dsProdList = new DataSet();
dsProdList.ReadXml(new StringReader(source));
prodDetail.DataSource = dsProdList;
prodDetail.DataBind();
}
这是DataList控件…
<asp:DataList ID="prodDetail" runat="server" OnItemDataBound="prodDetail_ItemDataBound">
<ItemTemplate>
<div class="proddetail">
<asp:Image ID="Image" runat="server" width="480" height="325" AlternateText='<%#DataBinder.Eval(Container.DataItem, "name") %>'/>
<asp:HiddenField ID="hdnStandalone" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "standalone") %>' Visible="false" />
<asp:HiddenField ID="hdnSellable" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "sellable") %>' Visible="false" />
<asp:HiddenField ID="hdnTypeId" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "product-type") %>' Visible="false" />
<asp:HiddenField ID="hdnOption1" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "option1") %>' Visible="false" />
<asp:HiddenField ID="hdnOption2" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "option2") %>' Visible="false" />
<asp:HiddenField ID="hdnOption3" runat="server" Value='<%#DataBinder.Eval(Container.DataItem, "option3") %>' Visible="false" />
<asp:Label ID="lblDescription" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "description") %>'>
</div>
</ItemTemplate>
</asp:DataList>
这似乎工作得很好,直到代码试图绑定"option1"在那一点上,我得到以下异常:数据绑定:"System.Data。DataRowView'不包含名为'option1'的属性
从我可以得出的结论,这显然是一个问题,"option1"是"定制"的孩子。如果我简单地注释掉开始和结束的"定制"标签,这有效地使"选项"作为"产品"的子元素,代码运行良好,我得到了我期望的输出。
是否有任何方法可以格式化DataBinder.Eval()来查看子项目?如果是这样的话,我也搞不清楚,几个小时的搜索都没有成功。还是我应该换个方式处理?也许不使用数据集?任何帮助都是感激的。谢谢。
您可以尝试使用xDoc
, linq
和anonymous
类型,
prodDetail.DataSource = from item in xDoc.Descendants("product")
from needThis in item.Descendants("customization")
select new
{ ProductName = item.Element("sku").Value,
ID = item.Element("prodID").Value,
//----other properties----
Option1 = needThis.Element("option1").Value,
Option2 = needThis.Element("option2").Value,
//---and some more properties----
};
您必须确保您提供的anonymous
对象的属性名称与您在datalist
的数据绑定中期望的属性名称相同。