c# - Linq to Xml : selecting elements if an attribute value equals a node value in an IEnumerable<XElement>

标签 c# asp.net xml linq

我创建了一个 IEnumerable 对象,它只包含我想要从 xml 文件中获取的节点:

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

所以它是这些的集合:

<rosterlist>
    <roster>
        <userid>1</userid>
        <name></name>
        <etc></etc>
    </roster>
    <roster>
        <userid>2</userid>
        <name></name>
        <etc></etc>
    </roster>
</rosterlist>

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

IEnumerable<XElement> 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)”的类型参数。尝试明确指定类型参数。

我的方法有什么问题?

最佳答案

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

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

但是我会通过使用连接查询来做到这一点。选择用户加入用户名册
它会像这样

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

输出:

User on roster       on Roster R1

关于c# - Linq to Xml : selecting elements if an attribute value equals a node value in an IEnumerable<XElement>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/574432/

相关文章:

c# - 保存不带 <NewDataSet> 标记的 DataSet ds.WriteXml(...)?

c# - 通过组合两列来选择不同的项目,其中第三列的值为 max-LINQ

c# - 使用获取类型,然后在 C# 中转换为该类型

c# - WP8 XAML DataTrigger CallMethodAction 用于从代码后面调用方法

c# - 如何使用 C# ASP.NET 与 Excel 文件进行交互

android - 新 Android 项目中缺少 main.xml - Eclipse OS X

asp.net - 显示带有嵌套 ListViews 的 IGrouping<>

asp.net - 跨多个 Access 数据库的内部连接

mysql - XML 数据插入 MySql DB

xml - XSLT - 从 URL 获取文件名