我从两个不同的文件中加载了两个 XElement。一个是默认文件,另一个是实时 XML。基本上我需要知道如何比较两个 XElement 并获取所有元素的集合,这些元素在实时文件中而不是在默认文件中。
我不关心检查值我只关心实时文件中是否存在不在默认文件中的元素。
基本上我正在比较两个 Web.config 文件,当用户升级我们的产品时,我需要检查他们的 web.config 以找到他们添加的任何不在我们模板中的元素,并在我放下之前将它们添加到我们的模板中并覆盖他们的。
我从两个不同的文件中加载了两个 XElement。一个是默认文件,另一个是实时 XML。基本上我需要知道如何比较两个 XElement 并获取所有元素的集合,这些元素在实时文件中而不是在默认文件中。
我不关心检查值我只关心实时文件中是否存在不在默认文件中的元素。
基本上我正在比较两个 Web.config 文件,当用户升级我们的产品时,我需要检查他们的 web.config 以找到他们添加的任何不在我们模板中的元素,并在我放下之前将它们添加到我们的模板中并覆盖他们的。
试试这个:
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
和 filter的操作数的顺序颠倒过来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();