我想获得一个基于后代的交易列表。但我无法正确获得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,因为如果位置发生变化或我们使用类似的事务与产品代码但结构不同我仍然希望能够获得交易。
答案 0 :(得分:1)
在按产品代码过滤交易时,您应该使用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结构的更改