返回不在其他XML中的元素

本文关键字:元素 XML 其他 返回 | 更新日期: 2023-09-27 18:28:26

我有两个XElements。每个包含多个子元素

例如

Xml1:

<Addresses>
  <Address>
   <Line1>1 Street</Line1>
   <Postcode>PL1 5RT</Postcode>
  </Address>
  <Line1>57 New Street</Line1>
   <Postcode>PL1 5RT</Postcode>
  </Address>
  <Address>
   <Line1>2 Street</Line1>
   <Postcode>PL1 5RT</Postcode>
  </Address>
</Addresses>

Xml2:

<Addresses>
  <Address>
   <Line1>1 Street</Line1>
   <Postcode>PL1 5RT</Postcode>
  </Address>
  <Address>
   <Line1>2 Street</Line1>
   <Postcode>PL1 5RT</Postcode>
  </Address>
</Addresses>

我正在尝试组合一个linq查询,它将过滤掉Xml中但不在Xml2中的地址元素(在上面的情况下,它将是地址"57 New Street")

目前我的代码如下:

var diffAddress = from address1 in Xml1.Elements()
                  from address2 in Xml2.Elements()
                  where (string)address1.Element("Line1") != (string)address2.Element("Line1") || 
                  where (string)address1.Element("Postcode") != (string)address2.Element("Postcode")
                  select address1;

但是它返回Xml1中的所有值我认为我可以通过一个查询来完成这项工作,或者我必须从两个查询中获得结果,然后对它们进行迭代,以获得Xml1中不在Xml2中的地址,这是对的吗??

如有任何帮助,我们将不胜感激:)

返回不在其他XML中的元素

您可以通过一些匿名查询让生活变得更轻松:

var addresses2 = from xaddr in x2.Root.Elements("Address")
                 let a = new
                         {
                             Line1 = xaddr.Element("Line1").Value,
                             PostalCode = xaddr.Element("Postcode").Value
                         }
                 select a;
// take the addresses in the first XML which are found in the second XML
// nota bene: this is case sensitive.
var addresses = (from xaddr in x1.Root.Elements("Address")
                 let a = new
                         {
                             Line1 = xaddr.Element("Line1").Value,
                             PostalCode = xaddr.Element("Postcode").Value
                         }
                 select a)
                .Intersect(addresses2);

您需要执行一个子查询-返回Xml1中位于Xml2中的所有元素-然后查找不在子查询中的Xml1的所有元素。

感谢Paul提供的信息!

以下是适合我使用"除外"操作员的解决方案的代码

    var newAddresses= Xml1.Descendants("Address").Cast<XNode>()
                      .Except(Xml2.Descendants("Address").Cast<XNode>(), new XNodeEqualityComparer());
相关文章: