【问题标题】:Using LINQ to filter XML file使用 LINQ 过滤 XML 文件
【发布时间】:2012-04-05 00:29:12
【问题描述】:

我有一个如下所示的 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">

但我也不知道如何过滤内部 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>

有什么想法吗?

再次感谢!!

【问题讨论】:

    标签: c# asp.net xml linq


    【解决方案1】:

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

    【讨论】:

    • 谢谢,谢谢,谢谢!!!它现在正在测试子项目!但是,子项 'User Admin' 仍会显示,即使它在 'IsUserAuthorized' 方法中设置为 false。
    【解决方案2】:

    我解决了我的问题,甚至消除了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));
    }
    

    感谢大家的帮助!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多