2010-09-05 24 views
0

我的第一個的XElement是:查找使用兩個xelements之間的增量「除了」 C#

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

,其中兩個文件除了程序應該找到的變化一樣...

回答

0

(在你的問題中的代碼,加載的同一文件Version1Version2。我假設這是一個錯字,而您實際上正在加載不同的文件。)

您不能使用Except來比較XElement s。您正在創建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)); 
相關問題