列出基于父类的树状结构

时间:2011-09-07 18:06:22

标签: c# asp.net xml traversal

我有像这样的XML Sitemap

<?xml version="1.0" encoding="utf-8" ?>
<Menu>
    <MenuItem Name="Page 1" Url="~/page1.aspx">
        <MenuItem Name="SubPage 1" Url="~/subpage1.aspx" />
    </MenuItem>
    <MenuItem Name="Page 2" Url="~/page2.aspx">
        <MenuItem Name="SubPage 1" Url="~/subpage1.aspx" />
        <MenuItem Name="SubPage 2" Url="~/subpage2.aspx">
            <MenuItem Name="ThirdLevel 1" Url="~/thirdlevel1.aspx" />
            <MenuItem Name="ThirdLevel 2" Url="~/thirdlevel2.aspx" />
            <MenuItem Name="ThirdLevel 3" Url="~/thirdlevel3.aspx" />
        </MenuItem>
        <MenuItem Name="SubPage 3" Url="~/subpage3.aspx" />
    </MenuItem>
    <MenuItem Name="Page 3" Url="~/page3.aspx" />
</Menu>

还有一个重复函数可以将所有这些循环到<ul>菜单中,如下所示:

// ^^^ loaded all into an XmlNodeList
private void CreateMenuItems(HtmlTextWriter writer, XmlNodeList menuitems)
{
    writer.RenderBeginTag(HtmlTextWriterTag.Ul);
    foreach (XmlNode item in menuitems)
    {
            writer.RenderBeginTag(HtmlTextWriterTag.Li);
            writer.AddAttribute(HtmlTextWriterAttribute.Href, this.ResolveUrl(item.Attributes["Url"].Value));
            writer.RenderBeginTag(HtmlTextWriterTag.A);
            writer.Write(item.Attributes["Name"].Value);
            writer.RenderEndTag();
            if (item.HasChildNodes)
            {
                // Recusive funktion
                CreateMenuItems(writer, item.ChildNodes);
            }
            writer.RenderEndTag();
    }
    writer.RenderEndTag();
}

这一切都非常好,并且它在树状菜单中列出了所有结构。

当我想创建DropDown菜单时,这很好。但是因为我想要一个侧边栏中的子页面,我需要创建一个新的Web控件,它根据上层父项列出当前的页面结构。

因此,如果我在“第2页”,我想要一个控件来获取“Page 2”-ChildNodes中的项目。如果我单击“SubPage 2”,我希望它列出来自上级父级“Page 2”的所有内容,如:

Page 1
Page 2 *click*
------------ SUB MENU I WANT TO LIST -------------
 --> SubPage 1
 --> SubPage 2 *click*
    --> ThirdLevel 1
    --> ThirdLevel 2
    --> Third Level 3 *current page*
  --> SubPage 3
------------ SUB MENU I WANT TO LIST -------------
Page 3

我知道我需要检测当前的url,找到XmlNode并返回。但我不确定如何在该级别上导航。 : - /

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用内置的站点地图功能? FindSiteMapNodeFromKey

如果你不需要处理一堆xml就没有意义。