LINQ到XML查询帮助
我试图得到2个xml文档的“差异”,并最终得到一个不同元素的列表。下面是XML,我想知道是否有人可以帮忙。在下面的示例中,我希望列表包含“file2.xml”元素和“file3.xml”元素,因为它们与第一个xml文档不同或是新的 提前谢谢LINQ到XML查询帮助,xml,linq,Xml,Linq,我试图得到2个xml文档的“差异”,并最终得到一个不同元素的列表。下面是XML,我想知道是否有人可以帮忙。在下面的示例中,我希望列表包含“file2.xml”元素和“file3.xml”元素,因为它们与第一个xml文档不同或是新的 提前谢谢 <?xml version="1.0" encoding="utf-8" ?> <versioninfo> <files> <file version="1.0">file1.xml</fil
<?xml version="1.0" encoding="utf-8" ?>
<versioninfo>
<files>
<file version="1.0">file1.xml</file>
<file version="1.0">file2.xml</file>
</files>
</versioninfo>
<?xml version="1.0" encoding="utf-8" ?>
<versioninfo>
<files>
<file version="1.0">file1.xml</file>
<file version="1.1">file2.xml</file>
<file version="1.0">file3.xml</file>
</files>
</versioninfo>
file1.xml
file2.xml
file1.xml
file2.xml
file3.xml
我相信您要做的是获得一个包含所有不同版本文件名的列表。如果是这样,这就可以做到:
XDocument first = (...);
XDocument second = (...);
var firstFiles = first.Element("versioninfo").Element("files").Elements("file");
var secondFiles = second.Element("versioninfo").Element("files").Elements("file");
var changedFileNames =
from f1 in firstFiles
join f2 in secondFiles
on f2.Value equals f1.Value
where f1.Attribute("version").Value != f2.Attribute("version").Value
select f1.Value;
var firstFileNames = firstFiles.Select(f => f.Value);
var secondFileNames = secondFiles.Select(f => f.Value);
var addedFileNames = firstFileNames.Except(secondFileNames);
var removedFileNames = secondFileNames.Except(firstFileNames);
var allChanges = changedFileNames
.Concat(addedFileNames)
.Concat(removedFileNames);
我相信你要做的就是得到一个列表,列出所有不同版本的文件名。如果是这样,这就可以做到:
XDocument first = (...);
XDocument second = (...);
var firstFiles = first.Element("versioninfo").Element("files").Elements("file");
var secondFiles = second.Element("versioninfo").Element("files").Elements("file");
var changedFileNames =
from f1 in firstFiles
join f2 in secondFiles
on f2.Value equals f1.Value
where f1.Attribute("version").Value != f2.Attribute("version").Value
select f1.Value;
var firstFileNames = firstFiles.Select(f => f.Value);
var secondFileNames = secondFiles.Select(f => f.Value);
var addedFileNames = firstFileNames.Except(secondFileNames);
var removedFileNames = secondFileNames.Except(firstFileNames);
var allChanges = changedFileNames
.Concat(addedFileNames)
.Concat(removedFileNames);
但也包括一个列表中的问题,而不是另一个,所以你的答案是答案的一半;我已将此更新为包含添加/删除的文件。它是原始文件中“不存在”的一半或缺失的文件list@cw:它不再是一半,第二部分是15分钟前添加的。@cw:添加或删除的元素都将为零,这取决于哪个元素被视为“最终”(我将其指定为
第一个
)。查看allChanges
集合。但也要查看其中一个列表中的内容,而不是另一个列表中的内容,因此你的答案是解决方案的一半。好的方面,应该仔细阅读问题;我已将此更新为包含添加/删除的文件。它是原始文件中“不存在”的一半或缺失的文件list@cw:它不再是一半,第二部分是15分钟前添加的。@cw:添加或删除的元素都将为零,这取决于哪个元素被视为“最终”(我将其指定为第一个
)。查看allChanges
集合。