选择基于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,因为如果位置发生变化,或者我们使用带有产品代码但结构不同的类似交易,我仍然希望能够获得交易。
根据产品代码过滤事务时,应该使用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结构的变化