lol*_*cat 8 c# xml linq asp.net
我创建一个IEnumerable对象,它只包含我想要的节点来自xml文件:
IEnumerable<XElement> rosters = XDocument.Load("roster.xml")
.Elements("rosterlist")
.Elements("roster")
.Where(w => w.Element("division")
.Value
.Equals("SUPER AWESOME DIVISION"));
Run Code Online (Sandbox Code Playgroud)
所以它是这些的集合:
<rosterlist>
<roster>
<userid>1</userid>
<name></name>
<etc></etc>
</roster>
<roster>
<userid>2</userid>
<name></name>
<etc></etc>
</roster>
</rosterlist>
Run Code Online (Sandbox Code Playgroud)
我想只抓取userid属性也是集合中userid节点的用户rosters.
IEnumerable<XElement> users = XDocument.Load("user.xml")
.Elements("userlist")
.Elements("user")
.Where(w => rosters.Elements("userid")
.Contains(w.Attribute("userid").Value));
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误:
无法从用法推断出方法'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable,TSource)'的类型参数.尝试显式指定类型参数.
我的做法有什么问题?
我看到的一个问题是,在最后一个代码片段中,...Elements("userid")返回一个XElement对象列表,这些对象不能包含Value属性返回的String.这应该工作......
IEnumerable<XElement> rosters = obRoot.Elements("rosterlist").Elements("roster");
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value));
IEnumerable<XElement> users = obRoot.Elements("userlist").Elements("user")
.Where(u => rosterUserIds.Contains(u.Attribute("userid").Value));
Run Code Online (Sandbox Code Playgroud)
但是我会通过使用连接查询来完成此操作.在userid上选择用户加入名单
它会是这样的
string sXml = @"
<root>
<rosterlist>
<roster>
<userid>1</userid>
<name>R1</name>
<etc></etc>
</roster>
<roster>
<userid>2</userid>
<name>R2</name>
<etc></etc>
</roster>
</rosterlist>
<userlist>
<user userid='1'>
<name>User on roster</name>
</user>
<user userid='5'>
<name>User not on roster</name>
</user>
</userlist>
</root>
";
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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
User on roster on Roster R1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20278 次 |
| 最近记录: |