2014-02-26 32 views
1

我有一個XmlDocument類型的內存中的文檔和一個從xml文件目錄加載的文件。我想比較這些最快的方式。XMLDocument與另一個文件比較

目前這是我如何做...但這是一個散列,並沒有像字節字節一樣快。我想修改這個字節一個字節..但想檢查任何可以加快速度......如快速長度比較。我不確定是否可以檢查長度,因爲一個在內存中,另一個從文件加載。文件名總是相同的,所以我不能檢查。

protected bool AreFilesTheSame(XmlDocument doc, string fileToCompareTo) 
    { 
     if (!File.Exists(fileToCompareTo)) 
      return (false); 

     try 
     { 
      SHA1CryptoServiceProvider cryptNewPub = new SHA1CryptoServiceProvider(); 
      byte[] xmlBytes = Encoding.UTF8.GetBytes(doc.OuterXml.ToCharArray()); 
      cryptNewPub.ComputeHash(xmlBytes); 

      SHA1CryptoServiceProvider cryptOldPub = new SHA1CryptoServiceProvider(); 
      FileStream fileStream = File.OpenRead(fileToCompareTo); 
      cryptOldPub.ComputeHash(fileStream); 
      fileStream.Close(); 

      if (cryptNewPub.Hash.Length != cryptOldPub.Hash.Length) 
       return (false); 

      for (int i = 0; i < cryptNewPub.Hash.Length; i++) 
      { 
       if (cryptNewPub.Hash[i] != cryptOldPub.Hash[i]) 
        return (false); 
      } 

      return (true); 
     } 
     catch 
     { 
      return (false); 
     } 
    } 
+0

您是否嘗試過簡單地加載文件的內容在一個字符串來比較,然後簡單地比較該字符串到'doc.OuterXml'。這應該比計算散列更快。 – LB2

+0

你需要字節比較,文本比較(忽略編碼差異)還是XML比較(忽略格式化和命名空間前綴)? –

+0

我認爲字節比較是全部。基本上它的xml文件是在內存中創建的......並且它會檢查之前創建的xml文件,這些文件現在位於驅動器中,以便在寫入之前查看它們是否不同。即使數據不同,文件名也是一樣的。我認爲它的可能長度可能是相同的,它是一個不同的文件。不關心XML的結構。基本上是一個字節比較,以確定是否需要覆蓋文件...真實或錯誤的答案。 – user3357948

回答

1

也許最簡單的方法是加載第二個XML文件,並比較OuterXML:

protected bool AreFilesTheSame(XmlDocument doc, string fileToCompareTo) 
    { 
     if (!File.Exists(fileToCompareTo)) 
      return (false); 

     try 
     { 
      XmlDocument doc2 = new XmlDocument(); 
      doc2.Load(fileToCompareTo); 

      return doc.OuterXml == doc2.OuterXml; 
     } 
     catch 
     { 
      return (false); 
     } 
    } 
+0

我只需要知道最快的方法來查看文件中是否有任何不同。它可以是任何..如果文件不同,我需要認識到這一點。事實上,它的XML並不重要,除了如何加載文件..一個作爲一個文件流,另一個作爲一個xmldocument ....但比較xml到xml似乎比字節的字節慢... ....怎麼做你加載這兩個,只是做一個字節比較字節.... – user3357948

+0

由於它們是XML,字節內容可能會不同,而XML內容是相同的。將兩者加載到內存中,並將它們作爲字符串**進行比較**是逐字節比較,並確保忽略不重要的字節(如空白)。 – wizulus

相關問題