0

我的第一个 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"))
        )); 

我想找到像这样的增量(源总是包含目标)......遗憾的是我的不工作:

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

Version1 和 Version2 是这样创建的:

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

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

4

1 回答 1

0

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

你不能Except用来比较XElements。您正在创建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));
于 2010-09-05T23:54:03.997 回答