C# 使用LINQ过滤XML文件

C# 使用LINQ过滤XML文件,c#,asp.net,xml,linq,C#,Asp.net,Xml,Linq,我有一个如下所示的XML文件: <SiteMenuItems> <SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" /> <SiteMenuItem text="Admin" roles="Admin"> <SiteMenuItem text="User Admin" navigateurl="/Authorized

我有一个如下所示的XML文件:

<SiteMenuItems>
    <SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
    <SiteMenuItem text="Admin" roles="Admin">    
        <SiteMenuItem text="User Admin" navigateurl="/Authorized/UserAdmin/Default.aspx" roles="SuperAdmin" />
    </SiteMenuItem>
</SiteMenuItems>
<SiteMenuItems>
    <SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
    <SiteMenuItem text="Admin" roles="Admin">    
    </SiteMenuItem>
</SiteMenuItems>
我的问题是代码只过滤第一级:

<SiteMenuItem text="Admin" roles="Admin">

但我也不知道如何过滤内部SiteMenuItem:

<SiteMenuItem text="User Admin" navigateurl="/Authorized/UserAdmin/Default.aspx" roles="SuperAdmin" />

现在,如果您具有管理员角色,它还会返回“User Admin”项

[更新] 多亏了woodings,我的子节点现在正在通过“IsUserAuthorized”测试

不幸的是,即使测试返回“User Admin”节点的“false”,该节点仍然作为整个XML文档的一部分返回

我希望它能返回这样的结果:

<SiteMenuItems>
    <SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
    <SiteMenuItem text="Admin" roles="Admin">    
        <SiteMenuItem text="User Admin" navigateurl="/Authorized/UserAdmin/Default.aspx" roles="SuperAdmin" />
    </SiteMenuItem>
</SiteMenuItems>
<SiteMenuItems>
    <SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
    <SiteMenuItem text="Admin" roles="Admin">    
    </SiteMenuItem>
</SiteMenuItems>

有什么想法吗

再次感谢

XElement.Elements()只返回该特定元素的直接子元素。改为使用XElement.subjections()

Elements()只返回该特定元素的直接子元素。改为使用XElement.subjections()


我解决了我的问题,甚至取消了
FilterRoles()
方法:

public string GetMenu() 
{
    XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath(WebConfigHelper.GetSiteMenu));

    xmlDoc.Descendants().Where(element => !UserHelper.IsUserAuthorized(element.Attribute("roles"))).Remove();

    return XsltTransformHelper.ExecuteXslTransformation(xmlDoc.ToString(), HttpContext.Current.Server.MapPath(WebConfigHelper.GetSiteMenuTransform));
}

谢谢大家的帮助

我解决了我的问题,甚至取消了
FilterRoles()
方法:

public string GetMenu() 
{
    XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath(WebConfigHelper.GetSiteMenu));

    xmlDoc.Descendants().Where(element => !UserHelper.IsUserAuthorized(element.Attribute("roles"))).Remove();

    return XsltTransformHelper.ExecuteXslTransformation(xmlDoc.ToString(), HttpContext.Current.Server.MapPath(WebConfigHelper.GetSiteMenuTransform));
}

谢谢大家的帮助

谢谢,谢谢,谢谢!!!它现在正在测试子项!!但是,子项“User Admin”仍将显示,即使它通过“IsUserAuthorized”方法设置为false。谢谢,谢谢,谢谢!!!它现在正在测试子项!!但是,尽管通过“IsUserAuthorized”方法将子项“User Admin”设置为false,但仍会显示该子项。