我有一个如下所示的 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>
有任何想法吗?
再次感谢!!