我有一個看起來像這樣的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>
任何想法?
再次感謝!
謝謝,謝謝,謝謝!它現在正在測試兒童項目!但是,子項「User Admin」仍然顯示,即使它從「IsUserAuthorized」方法設置爲false。 – 2012-04-05 00:44:22