【问题标题】:Query an XML using LINQ and excluding where an Attribute value is equal to that of an Element使用 LINQ 查询 XML 并排除属性值等于元素值的位置
【发布时间】:2013-04-05 15:32:57
【问题描述】:

我有一个针对 XML 的 LINQ 查询,它给了我一个嵌套列表的列表,每个子列表都是一个元素(“行”)属性的列表。

var items = loadbodies.Descendants("row").Select(a => a.Attributes().Select(b => b.Value).ToList()).ToList();

这按预期工作,但是,我真正需要的是针对另一个值列表查询它,以免添加子列表,其中元素属性之一(“messageID”)位于第二个列表中。我可以为一个值执行此操作,但需要对照整个第二个列表进行检查。

通过单个硬编码值从第二个列表中排除单个子列表的查询如下。

var items = loadbodies.Descendants("row").Where(c => (string)c.Attribute("messageID") != "avaluefromthesecondlist").Select(a => a.Attributes().Select(b => b.Value).ToList()).ToList();

任何帮助将不胜感激。

【问题讨论】:

    标签: c# xml linq list nested


    【解决方案1】:

    只需使用Contains。请注意,分割线有助于提高可读性:

    var ids = ...; // Some sequence of ids, e.g. a List<string> or HashSet<string>
    var items = loadbodies
          .Descendants("row")
          .Where(row => ids.Contains((string) row.Attribute("messageId")))
          .Select(a => a.Attributes()
                        .Select(b => b.Value)
                        .ToList())
          .ToList();
    

    请注意,您也可以使用 Join 调用...但只要您的 ID 相对较少,这应该没问题。

    【讨论】:

    • 对单行表示歉意,我没有想到它可能会影响其他人的可读性。我收到“布尔不包含‘选择’的定义”错误?
    • @Syrsyrian:我错过了一个右括号 - 现在再试一次。
    • 完美。出于好奇,是否有类似于“包含”但相反的东西,例如“DoesNotContain”?
    • @Syrsyrian:当然:!ids.Contains(...)
    • 太棒了,我刚刚尝试了“.Except”,但这显然没有按预期工作。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多