LINQ to XML复杂查询过滤

问题描述 投票:0回答:1

我有基于Microsoft文档的此代码。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/how-to-write-queries-with-complex-filtering

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>

如何从输出中排除没有指定区号的市场?如果符合条件,其余的代码都需要产品名称,市场名称和区号。

c# linq-to-xml
1个回答
0
投票

由于无法直接过滤子级,因此没有简单的方法来创建具有所需内容的新树。但是,您可以修改树:

© www.soinside.com 2019 - 2024. All rights reserved.