选择基于LINQ后代的XML事务

本文关键字:XML 事务 后代 LINQ 选择 | 更新日期: 2023-09-27 18:17:48

我想获得一个基于后代的事务列表。但我有麻烦得到linq语法正确。我的数据如下所示:

<Data>
    <MyTransactionXML>
           <contract>
                <contractID>1234</contractID>
                <ProductCode>ABC</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
    <MyTransactionXML>
            <contract>
                <contractID>13334</contractID>
                <ProductCode>DEF</ProductCode>
           </contract>
           ...
    </MyTransactionXML>
</Data>

我在想这样的事情,但它没有工作:

xdoc.Root.Descendants("MyTransactionXML")
         .Where(y => y.Descendants("ProductCode")
                      .Where(z => z.Value == "NY.E.ENG.JE.SVC.RF.VAR2.UP") == true);

我不想硬编码它是MyTransactionXML.contract。ProductCode,因为如果位置发生变化,或者我们使用带有产品代码但结构不同的类似交易,我仍然希望能够获得交易。

选择基于LINQ后代的XML事务

根据产品代码过滤事务时,应该使用Any()而不是Where(),因为谓词应该返回布尔值

from t in xdoc.Descendants("MyTransactionXML")
where t.Descendants("ProductCode").Any(c => (string)c == "DEF") // here
select t

与lambda语法相同:

xdoc.Descendants("MyTransactionXML")
     .Where(t => t.Descendants("ProductCode").Any(c => (string)c == "DEF"))

或者可以使用XPath扩展

xdoc.XPathSelectElements("//MyTransactionXML[*/ProductCode='DEF']");

*通配符匹配任何节点,所以你将处理xml结构的变化