c# - LINQ to XML 复杂查询过滤
问题描述
我有这个基于微软文档的代码。
string xml =
"<products>" +
"<product name=\"p1\">" +
"<market name=\"m1\">" +
"<areacode>12345</areacode>" +
"<areacode>12346</areacode>" +
"</market>" +
"<market name=\"m2\">" +
"<areacode>12345</areacode>" +
"<areacode>13346</areacode>" +
"</market>" +
"<market name=\"m3\">" +
"<areacode>12346</areacode>" +
"<areacode>13346</areacode>" +
"</market>" +
"</product>" +
"<product name=\"p2\">" +
"<market name=\"m1\">" +
"<areacode>12340</areacode>" +
"<areacode>12346</areacode>" +
"</market>" +
"<market name=\"m2\">" +
"<areacode>12340</areacode>" +
"<areacode>13346</areacode>" +
"</market>" +
"<market name=\"m3\">" +
"<areacode>12346</areacode>" +
"<areacode>13346</areacode>" +
"</market>" +
"</product>" +
"</products>";
XElement prods = XElement.Parse(xml);
IEnumerable<XElement> els =
from e1 in prods.Elements("product")
where
(string)e1.Attribute("name") == "p1" &&
(
from e2 in e1.Elements("market")
where
(
from e3 in e2.Elements("areacode")
where e3.Value == "12345"
select e3
).Any()
select e2
).Any()
select e1;
foreach (XElement el in els)
Console.WriteLine(el);
输出是
<product name="p1">
<market name="m1">
<areacode>12345</areacode>
<areacode>12346</areacode>
</market>
<market name="m2">
<areacode>12345</areacode>
<areacode>13346</areacode>
</market>
<market name="m3">
<areacode>12346</areacode>
<areacode>13346</areacode>
</market>
</product>
如何从输出中排除没有指定区号的市场?如果符合条件,其余代码都需要产品名称、市场名称和地区代码。
解决方案
没有简单的方法来创建一个拥有你想要的新树,因为你不能直接过滤孩子。但是,您可以修改您的树:
prods.Descendants("market").Where(m => m.Descendants("areacode").All(a => a.Value != "13346")).Remove();
prods.Descendants("product").Where(p => !p.Descendants("market").Any()).Remove();
推荐阅读
- c++ - 使用概念选择类模板专业化
- reactjs - 启动反应应用程序时不断出错
- excel - 寻找使用 Vaadin 将数据导出到 Excel 的解决方案
- android - 如何在我的 firebase 和 flutter 应用上创建实时用户数?
- bert-language-model - 用随机权重初始化 HuggingFace Bert
- javascript - three.js 场景未使用 socket.io / express 正确更新
- tensorflow - 在 tensorflow 中将 CSR 格式转换为密集/COO 格式
- php - 使用 Laravel 控制器通过 ajax 调用返回的结果,作为 php(laravel) 变量
- python - pyzopfli 和 zopflipng 模块不想安装(类似错误)
- google-earth-engine - 在图像集合中选择波段并根据 GEE 中的结果重新分类图像