2012-03-21 2 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 Правильно ли я думать, что я могу сделать это с помощью одного запроса или же я должен получить результаты от обоих и затем перебирать их, чтобы получить Адреса в Xml1, которые не находятся в Xml2 ??

Любая помощь будет принята с благодарностью :)

+3

Взгляните на LINQ «За исключением» оператора – paul

+0

Я не думаю, что ваш код компилируется в настоящее время данный блуждающий '|| 'и/или errant' where'. – user7116

+0

@paul: Я верю, что вместо этого он захочет «Интерсект». – user7116

ответ

0

Спасибо за информацию Paul!

Ниже приведен код, который подходит мое решение, используя «За исключением» оператора

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); 
Смежные вопросы