[英]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.