-2

次のようないくつかの要素を持つ2つのxmlドキュメントがあります

doc1

<Item id="22"/>
<Item id="33"/>
<Item id="44"/>
...

doc2

<Item id="33"/>
<Item id="44"/>
<Item id="66"/>
<Item id="88"/> 
...

他のdoc2要素を無視して、doc2に欠落している要素のみをdoc1から選択するクエリが必要です。

この場合、結果は次のようになります。

<Item id="22"/>

それ、どうやったら出来るの?

4

3 に答える 3

0

基本的に、2 番目のリストのすべての ID を使用してリストを作成し、doc1 の各項目がリストにあるかどうかを確認します。パフォーマンスに関しては、最良の選択ではないと思いますが、うまくいくはずです

        var qry = from item in doc1.Descendants("Item")
                  where
                     !(from item2 in doc2.Descendants("Item")
                     select item2.Attribute("id"),Value
                     ).ToList().Contains(item.Attribute("id").Value)
                  select item;

上記の linq-statement では、id のリストが doc1 のすべての要素に対して作成されていると思います。より良いオプションは、最初にリストを作成してから、次のステートメントでリストを使用することです。

        List<string> items = (from item2 in doc2.Descendants("Item")
                              select item2.Attribute("id").Value
                             ).ToList();

        var qry = from item in doc1.Descendants("Item")
                  where !items.Contains(item.Attribute("id").Value)
                  select item;
于 2013-10-26T10:47:17.497 に答える
0

おそらく、次のようなものです

doc1.Where(i1=>doc2.All(i2 => i2.id != i1.id))

あなたをそこに連れて行くことができます。

ただし、これはdoc1の各要素に対してdoc2でサブクエリを実行しています。小さいことを確認してください。

于 2013-10-26T10:40:53.293 に答える
0

最も簡単な方法は、 MoreLinqライブラリのExceptedByメソッドを使用することです。要素がルート要素の直下にあると仮定します。Item

var doc1 = XDocument.Load("doc1.xml");
var doc2 = XDocument.Load("doc2.xml");

var doc1Elements = doc1.Root.Elements("Item");
var doc2Elements = doc2.Root.Elements("Item");

var diff = doc1Elements.ExceptBy(doc2Elements, e => e.Attribute("id").Value);
于 2013-10-26T10:41:34.883 に答える