0

我有一个如下所示的 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>

使用我在这个 StackOverflow question中找到的示例,我能够提出以下代码:

    public string GetMenu()
    {

        XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath(@"~/App_Data/SiteMenu.xml"));
        xmlDoc = FilterRoles(xmlDoc); //Working on role problem
        return ExecuteXSLTransformation(xmlDoc.ToString());
    }

    private XDocument FilterRoles(XDocument xmlDoc)
    {
        XElement element = xmlDoc.Element("SiteMenuItems");
        XElement root = new XElement("SiteMenuItems",
                        (
                            from sm
                            in element.Elements("SiteMenuItem")
                            where UserHelper.IsUserAuthorized(sm.Attribute("roles"))
                            select new XElement(sm))
                        );

        XDocument menuXml = new XDocument();
        menuXml.Add(root);
        return menuXml;
    }

我遇到的问题是代码仅过滤第一级:

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

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

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

就像现在一样,如果您具有管理员角色,它还会返回“用户管理员”项。

[更新] 感谢woodings,我的子节点现在正在通过“IsUserAuthorized”测试。

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

我希望它会返回如下内容:

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

有任何想法吗?

再次感谢!!

4

2 回答 2

4

XElement.Elements() 仅返回该特定元素的直接子元素。请改用 XElement.Descendants()。

private XDocument FilterRoles(XDocument xmlDoc)
{
    XElement element = xmlDoc.Element("SiteMenuItems");
    XElement root = new XElement("SiteMenuItems",
                    (
                        from sm
                        in element.Descendants("SiteMenuItem")
                        where UserHelper.IsUserAuthorized(sm.Attribute("roles"))
                        select new XElement(sm))
                    );

    XDocument menuXml = new XDocument();
    menuXml.Add(root);
    return menuXml;
}
于 2012-04-05T00:35:26.967 回答
0

我解决了我的问题,甚至消除了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));
}

感谢大家的帮助!!!

于 2012-04-06T01:47:03.433 回答