LINQ to XML分组

时间:2011-07-22 19:47:43

标签: c# asp.net xml linq

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

  1. 阅读xml文件。
  2. 按MenuItem节点对xml文件进行分组。
  3. 使用MenuItem数据填充外部转发器。
  4. 对于每个MenuItem节点,使用MenuContent数据填充内部转发器。
  5. 我的问题是我不知道如何正确分组MenuItem节点和 然后填充内部中继器。用于分组的C#代码就是这样的 在一个较旧的项目中工作,但在这种情况下不起作用。我把它包括在内 得到一些代码。

    如何修复由MenuItem分组的C#代码 节点并填充内部转发器?

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

1 个答案:

答案 0 :(得分:4)

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

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