簡體   English   中英

使用LINQ過濾XML文件

[英]Using LINQ to filter XML file

我有一個 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 問題中找到的示例,我能夠得出以下代碼:

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

就像現在一樣,如果您具有 Admin 角色,它還會返回“User Admin”項。

[更新] 感謝 woodings,我的子節點現在正在接受“IsUserAuthorized”測試。

不幸的是,即使測試為“User Admin”節點返回“false”,該節點仍作為整個 XML 文檔的一部分返回。

我希望它會返回這樣的東西:

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

有任何想法嗎?

再次感謝!!

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;
}

我解決了我的問題,甚至取消了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));
}

感謝大家的幫助!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM