2012-04-05 79 views
0

我有一個看起來像這樣的XML文件:使用LINQ來過濾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> 

使用,我發現在at this 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"> 

但我不能figu重新如何過濾內部SiteMenuItem還有:

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

因爲它是現在,如果你有管理員角色,它也返回了「用戶管理」項目。

[更新] 感謝木材,我的孩子節點現在正在通過「IsUserAuthorized」測試。

不幸的是,即使測試對「用戶管理」節點返回「false」,該節點仍然作爲整個XML文檔的一部分返回。

我希望它會返回是這樣的:

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

任何想法?

再次感謝!

回答

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

感謝大家的幫助!

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

謝謝,謝謝,謝謝!它現在正在測試兒童項目!但是,子項「User Admin」仍然顯示,即使它從「IsUserAuthorized」方法設置爲false。 – 2012-04-05 00:44:22