2008-09-25 63 views
20

如何比較兩個(或更多)大型.resx文件的內容?在每個文件中有數百個名稱/值對,查看組合版本會非常有幫助。我對中性文化中存在的名稱/值對特別感興趣,但也沒有在文化特定版本中指定。如何比較多個.resx文件?

回答

29

有編輯RESX文件,在那裏你可以看到一次多國語言,並清楚地看到什麼是缺少或額外的一個偉大的免費軟件工具 - Zeta Resource Editor

-1

您可以使用像TortoiseSVN的差異(如果您使用Windows)的工具。只需選擇兩個文件,右鍵單擊,然後從TortoiseSVN子菜單中選擇「diff」。

4

如果在兩個文件中匹配的元素沒有以相同的順序出現,那麼對XML文件使用簡單的差異可能完全沒有用處。我一直在尋找一個XML特定的diff工具,迄今爲止沒有成功。

在此期間,我一直在使用的解決辦法是這樣的:

  • 打開.resx文件在Visual Studio中。
  • 選擇所有[Ctrl鍵 + ]和切[Ctrl鍵 + X](這可能需要一段時間對於大文件 - 是患者)
  • 粘貼[Ctrl鍵 + V ]和保存(這將重新創建.resx文件通過關鍵字排序)

當兩個文件都因此重新排序,正常diff'ing變得非常容易。您可以通過瀏覽diff來快速找到丟失的鍵。

7

雖然它本身不是一個差異工具,但RESX Synchronizer可能會幫助你。它的主要用途是使用中性語言的新條目更新本地化的.resx文件,並刪除所有已刪除的項目。

也許,通過使用/ v命令行開關生成的輸出可能是您需要的。否則,它會附帶完整的C#源代碼,因此可能可以根據您的需要進行調整。

+0

根本真棒。 thx – Konstantinos 2009-09-24 12:27:05

+1

RESX同步器已停產,但他們現在推薦使用[http://amanuens.com/](http://amanuens.com/),該版本可免費使用至2011年12月31日,看起來非常棒! – Luuk 2011-11-03 09:16:02

5

我試過幾個與XML比較工具。以下是總結(促使我評估它的要求是區分Visual Studio生成的資源文件,我認爲這是Microsoft犯的一個重大錯誤 - 元素順序是隨機的,Windows窗體始終會重寫ImageStream,如果你只是改變一個按鈕的位置,而對imageList不做任何事情)。

  1. 的xmldiff
  2. Araxis
  3. Altova DiffDog
  4. XML Notepad
  5. ExamXML
  6. Liquid XML Studio 2009(有一個XML DIFF菜單,但只有一個許可證版本可以使用它,所以我沒有機會給試試看)

首先,不應該考慮所有普通的差異工具,因爲他們對XML一無所知,他們將文本文件視爲文本行。

  1. XmlDiff是我試過的第一個工具。看起來它可以滿足我的需求,但是在下載源代碼(Visual Studio 2003)並使用Visual   Studio   2005(通過成功的自動升級)編譯後,我可以順利編譯這個小型項目。但是當我比較兩個真實的.resx文件(1295行)時,它崩潰了。在代碼中調試並不能讓我知道發生了什麼,因爲我沒有xmldiffpatch.dll XmlDiffPatch.View.dll的源代碼。

    而我之所以沒有嘗試挖掘更多這個工具是輸出格式或GUI設計。它會輸出一個HTML格式的文件,並在Internet Explorer的 窗口中突出顯示差異。對於一個大的XML文件差異,使用起來並不容易。

  2. XML記事本有一個簡單的內置XML差異。根據輸出窗口,我認爲它在內部使用XmlDiff的組件。輸出與XmlDiff相同。我會卸載它。

  3. Araxis是更傳統的文本比較工具,它也可以比較二進制文件,圖像文件,文件夾和Word文件。對於任何差異任務,除了 XML之外,我非常喜歡它,因爲它沒有支持XML的diff選項。

  4. Altova的DiffDog看起來像一個複雜的商業產品,它確實包含一個選項忽略元素順序,這對我來說是重要特徵。

    但是在嘗試使用相同的真實.resx文件(1295行,在我的經驗中不是一個大的文件)後,我發現如果兩個元素位於非常不同的位置,則「忽略元素順序」放置在兩個文件中。

  5. ExamXML看起來像一個商業產品,但它是一個小產品。但嘗試它之後,我發現這是目前對我的期望的最理想工具。

也有一個令人失望的一面:它墜毀時,我按下F10 導航到下一個差異。 忽略元素選項的順序很好。有一點可以肯定,被忽略的元素的定製並不那麼靈活。

label1.Size 
label1.Location 
label1.Width 

我想忽略所有在名稱中包含「.Size」或「.Location」或「.WIDTH」這些要素的差異,但它不可能在同一時間來定義這樣的條件。該自定義不支持正則表達式。

無論如何,我會用ExamXML(仔細地)比較XML文件。

更新1: 年過去了,現在我使用VS2017,winform沒有改變,因爲我對這個問題的初步回答。當工作需要分解給不同的人時,這個問題一而再,再而三地出現,讓我無聊。

其實我忘記了這個答案,谷歌把我帶到了這裏。

我開始了新的研究會議,並有一些很好的結果: https://www.codeproject.com/Articles/37022/Solving-the-resx-Merge-Problem 表明,如何eaisly我們可以按數據的RESX文件/ @通過LINQ name屬性。太奇妙了。核心代碼只是一個由幾個LINQ組成的語句。

然後我還發現ResXResourceManager,這是由該線程中的另一個答案指出的,作者回復了上面的代碼項目文章,並將此功能添加到ResXResourceManager中,ResxResourceManager中,您可以配置插件以自動排序resx文件時(之前)將其保存在配置選項卡中。甚至還有一個排序選項可供選擇:CurrentCulture,Ordinal或IgnoreCase等。

不幸的是,代碼項目解決方案和ResXResourceManager解決方案產生了不同的結果,源代碼可用,我發現代碼項目解決方案將「 & gt; & gt;「屬性值作爲普通文本,因此語義相關的小部件是分開的。這可以通過在LINQ中添加一個TrimStart('>')來修復。

但是,固定後這兩個工具仍然會產生不同的結果。 culprint是LINQ默認使用CurrentCulture對字符串進行排序,而我完全忽略了resXResourceManager中的相關排序選項,對於這個問題,我認爲最好的排序選項是「Ordinal」。將代碼項目解決方案中的排序選項添加並在ResXResourceManager中設置相同的排序選項後,最終它們會產生完全相同的結果!

儘管resxResourceManager非常適合集中管理資源並修復resx元素順序問題,但代碼項目工具對我來說仍然非常重要,因爲它是獨立的,因此可以在更廣泛的情況下使用它;此外,代碼非常簡潔優雅。

我會在我的更新結尾添加另一個註釋,我使用toolkit git,我使用Araxis來比較不同的版本,它幾乎沒有意義比較兩個resx文件修訂版,但是,Araxis支持自定義過濾器在比較引擎看到它之前轉換輸入文件。爲進行比較,Araxis通過以下命令調用篩選器: sortresx.exe -f C:\ Users \ ADMINI〜1 \ AppData \ Local \ Temp \ mrg.8032.3.resx C:\ Users \ ADMINI〜1 \ AppData \ Local \ Temp \ mrg.8032.2 C:\ Users \ ADMINI〜1 \ AppData \ Local \ Temp \ mrg.8032.4

-f表示前進,第一個文件名是輸入文件,第二個文件名是輸出文件過濾器應寫入,第三個可以安全地忽略。在對代碼項目代碼做了一些改動之後,我現在可以編譯一個過濾程序,在Araxis中對其進行配置,並且對舊的,混亂的resx文件進行合理的resx修訂比較。

2

對於較新版本的Visual Studio(2010+),現在有一個名爲ResXManager的Visual Studio擴展(由tomenglert創建),這對於此非常了不起。

它允許您並排查看每種語言中的每個資源並突出顯示缺少的資源。 (以下示例來自擴展下載頁面。)

Example From Extension Download Page