2012-03-21 25 views
0

我有2个XElements。每一个包含多个儿童要件返回不在其他XML中的元素

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 难道我就在想,我可以通过一个单一的查询做到这一点还是我将不得不透过这两个结果然后遍历它们以获取不在Xml2中的Xml1中的地址?

任何帮助,将不胜感激:)

+3

看一看的LINQ“除”操作 – paul 2012-03-21 13:21:00

+0

我不认为你的代码目前汇编给出错误的'代码|| '和/或错误'在哪里。 – user7116 2012-03-21 14:11:23

+0

@paul:我相信他会想'交集'。 – user7116 2012-03-21 14:23:41

回答

0

感谢资讯保罗!

下面是一个适合使用我的解决方案“除了”运营商

var newAddresses= Xml1.Descendants("Address").Cast<XNode>() 
         .Except(Xml2.Descendants("Address").Cast<XNode>(), new XNodeEqualityComparer()); 
0

你需要做一个子查询 - 返回从XML1是在XML2的所有元素 - 然后发现没有在子查询中XML1的所有元素。

1

可以使生活更轻松一些匿名查询:

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);