从一个XElement中获取不在另一个XElement中的元素

时间:2012-09-05 14:22:19

标签: c# linq linq-to-xml

我从两个不同的文件中加载了两个XElements。一个是默认文件,另一个是实时XML。基本上我需要知道如何比较两个XElements并获取实时文件中而不是默认文件中的所有元素的集合。

我不关心检查值,如果实时文件中有一个元素不在默认文件中,我只关心。

基本上我正在比较两个Web.config文件,当用户升级我们的产品时,我需要检查他们的web.config,找到他们添加的任何不在我们模板中的元素,并在我之前将它们添加到我们的模板中把它放下来并覆盖它们。

1 个答案:

答案 0 :(得分:2)

试试这个:

var addedNames = new HashSet<string>(
    liveXml.Elements().Select(e => e.Name).Except(
        defXml.Elements().Select(e => e.Name)
    )
);
var addedElements = liveXml
    .Elements()
    .Where(e => addedNames.Contains(e.Name))
    .ToList();

此方法构造liveXml中不存在的defXml个元素名称列表,将它们放在一个集合中,然后使用该集合来过滤liveXml的元素

对于已移除的元素,请反转传递给Except的操作数的顺序,并过滤defXml

var droppedNames = new HashSet<string>(
    defXml.Elements().Select(e => e.Name).Except(
        liveXml.Elements().Select(e => e.Name)
    )
);
var droppedElements = defXml
    .Elements()
    .Where(e => addedNames.Contains(e.Name))
    .ToList();