使用“except”C#查找两个xelements之间的增量

时间:2010-09-05 21:50:48

标签: c# xml comparison xelement

我的第一个XElement是:

XElement sourceFile = new XElement("source",
                from o in Version1.Element("folder").Elements("folders").ElementAt(0).Elements("folder")
                where o.Name != null && o.Name == "folder"
                select new XElement("data",
                    new XElement("name",(string) o.Attribute("name")),
                    new XElement("filesCount", (string)o.Attribute("folderCount")),
                    new XElement("filesCount", (string)o.Attribute("filesCount"))
            )); 
            //,o)

我的第二个是:

XElement targetFile = new XElement("target",
            from o in Version2.Element("folder").Elements("folders").ElementAt(0).Elements("folder")
            where o.Name != null && o.Name == "folder"
            select new XElement("data",
                new XElement("name", (string)o.Attribute("name")),
                new XElement("filesCount", (string)o.Attribute("folderCount")),
                new XElement("filesCount", (string)o.Attribute("filesCount"))
        )); 

我想找到delta(源始终包含目标) 这样的事情......遗憾的是我的工作不正常:

XElement nodenotinsource = new XElement ("result",
            from y in sourceFile.Elements().Except(from o in targetFile.Elements())
           select new XElement("ttt", y.Element("name").Value));

版本1和版本2的创建方式如下:

XElement Version1 = XElement.Load(@"C:\output\xmltestO.xml");
XElement Version2 = XElement.Load(@"C:\output\xmltestO.xml");

这两个文件是相同的,除了程序应该找到的更改...

1 个答案:

答案 0 :(得分:0)

(在您问题的代码中,您正在将相同的文件加载到Version1Version2。我会假设这是一个拼写错误而您实际上正在加载不同的文件。)

您无法使用Except来比较XElement。您正在创建XElement的单独实例。即使它们包含相同的内容,它们也不会相等。

因此,您需要比较原始数据。例如:

var sourceData =
    from o in Version1.Element("folder").Elements("folders").ElementAt(0).Elements("folder")
    where o.Name != null && o.Name == "folder"
    select new {
        Name = (string) o.Attribute("name")),
        FolderCount = (string)o.Attribute("folderCount")),
        FilesCount = (string)o.Attribute("filesCount"))
    };

然后对目标文件执行相同操作以获取targetData。最后,您可以使用Except对其进行比较,然后生成最终的XElement

XElement nodenotinsource = new XElement ("result",
    from y in sourceData.Except(targetData)
    select new XElement("ttt", y.Name));