使用“除外”来找到两个x元素之间的增量。 C# [英] Find the delta between two xelements using "except" C#

查看:128
本文介绍了使用“除外”来找到两个x元素之间的增量。 C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的第一个XElement是:

  XElement sourceFile = new XElement(source,
from o in Version1 。元素(文件夹)。元素(文件夹)。ElementAt(0).Elements(folder)
其中o.Name!= null& o.Name ==folder
select new XElement(data,
new XElement(name,(string)o.Attribute(name)),
new XElement(filesCount, .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)
其中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,
y in sourceFile.Elements()。Except(from o in targetFile.Elements())
select new XElement(ttt,y.Element(name)。

版本1和版本2创建如下:

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

其中两个文件是相同的,除了程序应该更改...

解决方案

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



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



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

  var sourceData = 
来自Version1.Element(folder ).ElementAt(0).Elements(folder)
其中o.Name!= null&& o.Name ==folder
select new {
Name =(string)o.Attribute(name)),
FolderCount =(string)o.Attribute(folderCount )),
FilesCount =(string)o.Attribute(filesCount))
};

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

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


My first XElement is:

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)

My second is:

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

I'd like to find the delta (the source always contains the target) something like this... sadly my is not working:

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 and Version2 were created like this:

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

where the two files are the same except the change the program should find...

解决方案

(In the code in your question, you are loading the same file into Version1 and Version2. I’ll assume this is a typo and you are actually loading different files.)

You can’t use Except to compare XElements. You are creating separate instances of XElement. Even though they contain the same contents, they will not compare as equal.

Therefore, you need to compare the original data. For example:

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

Then do the same with the target file to get targetData. Finally, you can compare them using Except and then generate your final XElement:

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

这篇关于使用“除外”来找到两个x元素之间的增量。 C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆