-2

我有两个 xml 文档,其中包含一些元素,例如

文档1

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

文档2

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

我需要一个查询来仅从 doc1 中选择 doc2 中缺少的那些元素,而忽略其他 doc2 元素。

在这种情况下,结果将是:

<Item id="22"/>

我怎么做?

4

3 回答 3

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 回答
0

基本上,您使用第二个列表中的所有 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 语句中,我认为 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 回答