Question

Ma première XElement est:

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)

La deuxième est:

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"))
        )); 

Je voudrais trouver le delta (la source contient toujours la cible) quelque chose comme ça ... malheureusement mon ne fonctionne pas:

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 et Version2 ont été créés comme ceci:

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

où les deux fichiers sont identiques, sauf le changement du programme devrait trouver ...

Était-ce utile?

La solution

(Dans le code dans votre question, vous chargez le même fichier dans Version1 et Version2. Je suppose que cela est une faute de frappe et que vous chargez en fait des fichiers différents.)

Vous ne pouvez pas utiliser Except pour comparer XElements. Vous créez des instances distinctes de XElement. Même si elles contiennent le même contenu, ils ne seront pas considérées comme égales.

Par conséquent, vous devez comparer les données d'origine. Par exemple:

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"))
    };

Ensuite, faites la même chose avec le fichier cible pour obtenir targetData. Enfin, vous pouvez les comparer à l'aide Except puis générer votre XElement final:

XElement nodenotinsource = new XElement ("result",
    from y in sourceData.Except(targetData)
    select new XElement("ttt", y.Name));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top