我创建一个IEnumerable对象,它只包含我想要的节点来自xml文件:
IEnumerablerosters = XDocument.Load("roster.xml") .Elements("rosterlist") .Elements("roster") .Where(w => w.Element("division") .Value .Equals("SUPER AWESOME DIVISION"));
所以它是这些的集合:
1 2
我想只抓取userid
属性也是集合中userid
节点的用户rosters
.
IEnumerableusers = 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)'的类型参数.尝试显式指定类型参数.
我的做法有什么问题?
我看到的一个问题是,在最后一个代码片段中,...Elements("userid")
返回一个XElement对象列表,这些对象不能包含Value属性返回的String.这应该工作......
IEnumerablerosters = 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 = @""; 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); } 1 R1 2 R2 User on roster User not on roster
输出:
User on roster on Roster R1