LINQ到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

我试图得到2个xml文档的“差异”,并最终得到一个不同元素的列表。下面是XML,我想知道是否有人可以帮忙。在下面的示例中,我希望列表包含“file2.xml”元素和“file3.xml”元素,因为它们与第一个xml文档不同或是新的

提前谢谢

<?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
集合。