我从两个不同的文件中加载了两个XElements。一个是默认文件,另一个是实时XML。基本上我需要知道如何比较两个XElements并获取实时文件中而不是默认文件中的所有元素的集合。
我不关心检查值,如果实时文件中有一个元素不在默认文件中,我只关心。
基本上我正在比较两个Web.config文件,当用户升级我们的产品时,我需要检查他们的web.config,找到他们添加的任何不在我们模板中的元素,并在我之前将它们添加到我们的模板中把它放下来并覆盖它们。
答案 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();