C# LINQ到XML分组

C# LINQ到XML分组,c#,asp.net,xml,linq,C#,Asp.net,Xml,Linq,我正在尝试从xml文件以编程方式为我的网站创建菜单。 该菜单在菜单栏中有三个链接,可在鼠标悬停事件和 显示内容(链接和图像)。xml文件具有MenuItem节点,这些节点 对应于菜单栏和菜单内容节点中的三个链接 对应于鼠标悬停在内容上。在psuedo代码中,我想 做: 读取xml文件 按MenuItem节点对xml文件进行分组 用菜单项数据填充外部中继器 对于每个MenuItem节点,使用MenuContent数据填充内部转发器 我的问题是,我不知道如何正确地对MenuItem节点和 然后填充内

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

  • 读取xml文件
  • 按MenuItem节点对xml文件进行分组
  • 用菜单项数据填充外部中继器
  • 对于每个MenuItem节点,使用MenuContent数据填充内部转发器
  • 我的问题是,我不知道如何正确地对MenuItem节点和 然后填充内部中继器。分组的C#代码是 曾在较旧的项目中工作,但在本例中不起作用。我把它包括进来只是为了 获取一些代码

    如何通过菜单项将C#代码修改为group 节点并填充内部中继器

    <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>
    
    
    var menuPath=Server.MapPath(“~/Menu.xml”);
    var xDocument=xDocument.Load(menuPath);
    var menuItems=新列表();
    变量组=(从xDocument.XPathSelectElements(“菜单”)中的x开始)
    x组由新
    {
    Description=x.x(“Description”).FirstOrDefault()值,
    ImageToolTip=x.x(“ImageToolTip”).FirstOrDefault()值,
    ImageUrl=x.x(“ImageUrl”).FirstOrDefault()值,
    LinkUrl=x.x(“LinkUrl”).FirstOrDefault()值,
    Title=x.x(“Title”).FirstOrDefault()值
    }进入g
    选择g).ToDictionary(g=>g.Key,g=>g.ToArray());
    Repeater1.DataSource=组;
    Repeater1.DataBind();
    标题1a
    说明1a
    链接URL 1a
    图像URL 1a
    图像工具提示1a
    标题2a
    说明2a
    链接URL 2a
    图像URL 2a
    图像工具提示2a
    标题3a
    说明3a
    链接URL 3a
    图像URL 3a
    图像工具提示3a
    标题1b
    说明1b
    链接URL 1b
    图像URL 1b
    图像工具提示1b
    标题2b
    说明2b
    链接URL 2b
    图像URL 2b
    图像工具提示2b
    标题3b
    说明3b
    链接URL 3b
    图像URL 3b
    图像工具提示3b
    
    您可以尝试以下操作,而不是使用聚合:

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

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

    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">
    
    
    
    完美!这正是我需要做的!非常感谢你!完美的这正是我需要做的!非常感谢你!