【问题标题】:LINQ to XML GroupingLINQ to XML 分组
【发布时间】:2011-07-22 19:47:42
【问题描述】:

我正在尝试从 xml 文件以编程方式为我的网站创建一个菜单。 该菜单在菜单栏中有三个链接,它们在鼠标悬停事件上展开,并且 显示内容(链接和图像)。 xml 文件具有 MenuItem 节点 对应菜单栏和 MenuContent 节点中的三个链接 对应于鼠标悬停的内容。在伪代码中,这就是我想要的 做:

  1. 读取 xml 文件。
  2. 按 MenuItem 节点对 xml 文件进行分组。
  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>

【问题讨论】:

    标签: c# asp.net xml linq


    【解决方案1】:

    您可以尝试以下方法,而不是使用聚合:

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

    【讨论】:

    • 完美!正是我需要做的!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多