当前位置:  开发笔记 > 编程语言 > 正文

Linq to Xml:如果属性值等于IEnumerable <XElement>中的节点值,则选择元素

如何解决《LinqtoXml:如果属性值等于IEnumerable<XElement>中的节点值,则选择元素》经验,为你挑选了1个好方法。

我创建一个IEnumerable对象,它只包含我想要的节点来自xml文件:

IEnumerable rosters = XDocument.Load("roster.xml")
                                         .Elements("rosterlist")
                                         .Elements("roster")
                                         .Where(w => w.Element("division")
                                                      .Value
                                                      .Equals("SUPER AWESOME DIVISION"));

所以它是这些的集合:


    
        1
        
        
    
    
        2
        
        
    

我想只抓取userid属性也是集合中userid节点的用户rosters.

IEnumerable users = XDocument.Load("user.xml")
                                       .Elements("userlist")
                                       .Elements("user")
                                       .Where(w => rosters.Elements("userid")
                                                          .Contains(w.Attribute("userid").Value));

但它给了我一个错误:

无法从用法推断出方法'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable,TSource)'的类型参数.尝试显式指定类型参数.

我的做法有什么问题?



1> Gishu..:

我看到的一个问题是,在最后一个代码片段中,...Elements("userid")返回一个XElement对象列表,这些对象不能包含Value属性返回的String.这应该工作......

IEnumerable rosters = obRoot.Elements("rosterlist").Elements("roster");
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value));
IEnumerable users = obRoot.Elements("userlist").Elements("user")
                .Where(u => rosterUserIds.Contains(u.Attribute("userid").Value));

但是我会通过使用连接查询来完成此操作.在userid上选择用户加入名单
它会是这样的

string sXml = @"


    
        1
        R1
        
    
    
        2
        R2
        
    


    
        User on roster
    
    
        User not on roster
    



";

XElement obRoot = XElement.Parse( sXml );
var results = from user in obRoot.Elements("userlist").Elements("user")
   join roster in obRoot.Elements("rosterlist").Elements("roster")
   on user.Attribute("userid").Value equals roster.Element("userid").Value
   select new {Name=user.Element("name").Value, RosterName=roster.Element("name").Value} ;

foreach (var v in results)
{
   Console.WriteLine("{0, -20} on Roster {1, -20}", v.Name, v.RosterName);
}

输出:

User on roster       on Roster R1

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有