LINQ to XML Grouping

本文关键字:Grouping XML to LINQ | 更新日期: 2023-09-27 18:03:04

我试图从xml文件以编程方式为我的网站创建一个菜单。菜单栏中有三个链接,鼠标在事件和显示内容(链接和图片)。xml文件有MenuItem节点对应于菜单栏和MenuContent节点中的三个链接对应鼠标在内容上的移动。在伪代码中,我想这样做做的事:

  1. 读取xml文件
  2. 将xml文件按MenuItem节点分组
  3. 用MenuItem数据填充外部中继器
  4. 对于每个MenuItem节点,用MenuContent数据填充内部中继器。

我的问题是我不知道如何正确分组MenuItem节点和然后填充内部中继器。c#中用于分组的代码在以前的项目中工作过,但在这种情况下不起作用。我把它放进去只是为了写点代码出来。

如何修复c#代码按MenuItem分组节点和填充内部中继器?

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <div>
            <asp:Repeater ID="Repeater2" runat="server">
                <ItemTemplate>
                    <div class="menuContent">
                        <div>
                            <div class="menuContentItem">
                                <a href='<%# Eval("LinkUrl") %>'>
                                    <table>
                                        <tr>
                                            <td align="center" valign="middle">
                                                <img src='<%# Eval("ImageUrl") %>' alt='<%# Eval("ImageToolTip") %>' />
                                            </td>
                                            <td align="left" valign="top">
                                                <div><%# Eval("Title") %></div>
                                                <div><%# Eval("Description") %></div>
                                            </td>
                                        </tr>
                                    </table>
                                </a>
                            </div>
                        </div>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </ItemTemplate>
</asp:Repeater>

var menuPath = Server.MapPath("~/Menu.xml");
var xDocument = XDocument.Load(menuPath);
var menuItems = new List<MenuItem>();
var groups = (from x in xDocument.XPathSelectElements("Menu")
              group x by new
              {
                  Description = x.Descendants("Description").FirstOrDefault().Value,
                  ImageToolTip = x.Descendants("ImageToolTip").FirstOrDefault().Value,
                  ImageUrl = x.Descendants("ImageUrl").FirstOrDefault().Value,
                  LinkUrl = x.Descendants("LinkUrl").FirstOrDefault().Value,
                  Title = x.Descendants("Title").FirstOrDefault().Value
              } into g
              select g).ToDictionary(g => g.Key, g => g.ToArray());

Repeater1.DataSource = groups;
Repeater1.DataBind();

<?xml version="1.0" encoding="utf-8" ?>
<Menu>
    <MenuItem>
        <MenuContent>
            <Title>Title 1a</Title>
            <Description>Description 1a</Description>
            <LinkUrl>Link URL 1a</LinkUrl>
            <ImageUrl>Image URL 1a</ImageUrl>
            <ImageToolTip>Image ToolTip 1a</ImageToolTip>
        </MenuContent>
        <MenuContent>
            <Title>Title 2a</Title>
            <Description>Description 2a</Description>
            <LinkUrl>Link URL 2a</LinkUrl>
            <ImageUrl>Image URL 2a</ImageUrl>
            <ImageToolTip>Image ToolTip 2a</ImageToolTip>
        </MenuContent>
        <MenuContent>
            <Title>Title 3a</Title>
            <Description>Description 3a</Description>
            <LinkUrl>Link URL 3a</LinkUrl>
            <ImageUrl>Image URL 3a</ImageUrl>
            <ImageToolTip>Image ToolTip 3a</ImageToolTip>
        </MenuContent>
    </MenuItem>
    <MenuItem>
        <MenuContent>
            <Title>Title 1b</Title>
            <Description>Description 1b</Description>
            <LinkUrl>Link URL 1b</LinkUrl>
            <ImageUrl>Image URL 1b</ImageUrl>
            <ImageToolTip>Image ToolTip 1b</ImageToolTip>
        </MenuContent>
        <MenuContent>
            <Title>Title 2b</Title>
            <Description>Description 2b</Description>
            <LinkUrl>Link URL 2b</LinkUrl>
            <ImageUrl>Image URL 2b</ImageUrl>
            <ImageToolTip>Image ToolTip 2b</ImageToolTip>
        </MenuContent>
        <MenuContent>
            <Title>Title 3b</Title>
            <Description>Description 3b</Description>
            <LinkUrl>Link URL 3b</LinkUrl>
            <ImageUrl>Image URL 3b</ImageUrl>
            <ImageToolTip>Image ToolTip 3b</ImageToolTip>
        </MenuContent>
    </MenuItem>
</Menu>

LINQ to XML Grouping

不使用聚合,您可以尝试以下操作:

var groups = from x in xd.Element("Menu").Elements("MenuItem")
             select new
             {
                 Items = (from c in x.Elements("MenuContent")
                          select new
                          {
                              Description = c.Element("Description").Value,
                              ImageToolTip = c.Element("ImageToolTip").Value,
                              ImageUrl = c.Element("ImageUrl").Value,
                              LinkUrl = c.Element("LinkUrl").Value,
                              Title = c.Element("Title").Value
                          }).ToList()
             };

,然后将Repeater2标签改为:

<asp:Repeater ID="Repeater2" DataSource='<%# Eval("Items") %>' runat="server">