在asp.net的GridView列中显示子XML元素

本文关键字:显示 XML 元素 asp net GridView | 更新日期: 2023-09-27 18:24:27

我有如下结构的XML文档。

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <productID></productID>
        <productName></productName>
        <productDesc></productDesc>
        <productFeatures>
            <Feature></Feature>
            <Feature></Feature>
            <Feature></Feature>
        </productFeatures>
    </product>
    <product>
        <productID></productID>
        <productName></productName>
        <productDesc></productDesc>
        <productFeatures>
            <Feature></Feature>
            <Feature></Feature>
            <Feature></Feature>
            <Feature></Feature>
            <Feature></Feature>
            <Feature></Feature>
        </productFeatures>
    </product>
</products>

我成功地在GridView中显示了产品元素,但我仍在寻找一种显示其中内部元素的方法如下所示。

        var bind = productsDoc.Descendants("products").Select(product => new
        { 
            productID = product.Element("productID").Value,
            productName = product.Element("productName").Value,
            productDesc = product.Element("productDesc").Value,
            productAllFeatures = product.Element("productFeatures").Element("Feature").Value,
        }).OrderBy(product  => product.productName).ToList();
        producsGrdView.DataSource = bind;
        producsGrdView.DataBind();

现在,通过注意xml文件,我们可以看到多个"Feature"元素属于同一个产品,其关系是(多对一)。

此外,在上面的代码中,productAllFeatures只显示第一个"Feature"。

我的问题是:

如何将多对一关系中的数据、属于一个产品的多个功能加载到同一个GridView中?

如何将产品GrdView中的所有功能显示为一个网格列?

有简单的方法吗?

在asp.net的GridView列中显示子XML元素

第一步是将productAllFeatures转换为某种类型的列表,比如字符串:

var bind = productsDoc.Descendants("products").Select(product => new
{
    ...
    productAllFeatures = product.Element("productFeatures")
                                .Descendants("Feature")
                                .Select(x => x.Value)
                                .ToList()
}).OrderBy(product  => product.productName).ToList();

现在在网格视图中,您可能希望使用内部中继器来绑定此列表并显示它:

<Columns>
...
    <TemplateField HeaderText="Features">
        <ItemTemplate>
            <asp:Repeater runat="server" DataSource='<%# Eval("productAllFeatures") %>'>
                <ItemTemplate>
                    <%# Container.DataItem.ToString() %>
                </ItemTemplate>
            </asp:Repeater>
        </ItemTemplate>
    </TemplateField>

不过我没有测试它,所以一些小错误可能潜伏在