Найти дельту между двумя элементами x используя "кроме" C # - PullRequest
0 голосов
/ 06 сентября 2010

Мой первый 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));

Версия1 и Версия2 были созданы следующим образом:

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

, где два файла совпадают, за исключением изменений, которые должна найти программа ...

1 Ответ

0 голосов
/ 06 сентября 2010

(В коде вашего вопроса вы загружаете тот же файл в Version1 и Version2. Я предполагаю, что это опечатка, а вы на самом деле загружаете разные файлы.)

Вы не можете использовать 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));
...