Trouver le delta entre deux xelements en utilisant « sauf » C #
-
01-10-2019 - |
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 ...
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 XElement
s. 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));