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 に答える