如何比较多个.resx文件?

时间:2020-03-06 14:45:17  来源:igfitidea点击:

如何比较两个(或者多个)大.resx文件的内容?每个文件中都有数百个"名称/值"对,因此查看组合的版本将非常有帮助。我对中性文化中存在的名称/值对特别感兴趣,但在特定于文化的版本中也未指定。

解决方案

我们可以使用TortoiseSVN的diff之类的工具(如果使用Windows)。只需选择两个文件,右键单击,然后从TortoiseSVN子菜单中选择" diff"。

如果匹配的元素在两个文件中的显示顺序不同,则对XML文件使用简单的diff可能完全没有用。到目前为止,我也一直在寻找特定于XML的差异工具,但迄今没有成功。

同时,我一直在使用的解决方法是:

  • 在Visual Studio中打开.resx文件。
  • 全选[Ctrl + A]并剪切Ctrl + X
  • 粘贴[Ctrl + V]并保存(这将重新创建按键排序的.resx文件)

这样对两个文件重新排序后,正常的区分变得非常容易。我们现在可以通过浏览差异快速找到丢失的键。

尽管它本身不是差异工具,但RESX Synchronizer可能会在这里为我们提供帮助。它的主要用途是使用来自中性语言的新条目更新本地化的.resx文件,并删除所有已删除的项目。

通过/ v命令行开关使用它生成的输出可能是我们所需要的。否则,它的确带有完整的C源代码,因此我们可以根据需要对其进行调整。

我们可以使用XML Diff编写代码。请参阅在应用程序中使用XML Diff and Patch工具。

有一个很棒的免费软件工具可以编辑resx文件,我们可以在其中一次看到多种语言,并清楚地看到缺少的内容或者额外的Zeta资源编辑器

我已经尝试了几种XMl差异工具。这是摘要(促使我评估它的要求是对Visual Studio生成的.resx资源文件进行比较,我认为这是一个很大的错误,因为Microsoft使元素的顺序是随机的,并且Windows Forms总是重新如果我们只是更改按钮的位置而对imageList不执行任何操作,请编写ImageStream。

  • XmlDiff
  • 轴数
  • Altova DiffDog
  • XML记事本
  • 考试XML
  • Liquid XML Studio 2009(有一个XML diff菜单,但是只有许可证版本可以使用。因此,我没有机会尝试一下)

首先,不应考虑所有常规的diff工具,因为它们对XML一无所知,它们将文本文件视为仅一行文本。

  • XmlDiff是我尝试的第一个工具。看起来确实可以满足我的需要,但是在下载了源代码(Visual Studio 2003)并使用Visual Studio 2005进行了编译(自动升级成功之后)之后,我可以顺利地编译小型项目。但是当我比较两个真实的.resx文件(1295行)时,它崩溃了。调试代码不会给我任何提示,因为我没有xmldiffpatch.dll XmlDiffPatch.View.dll的源代码。我之所以不尝试进一步研究此工具,是因为输出格式或者GUI设计。它输出一个HTML文件,该文件在Internet Explorer托管的窗口中突出显示了差异。对于较大的XML文件差异,使用起来并不容易。
  • XML记事本具有一个简单的内置XML差异。根据输出窗口,我认为它在内部使用XmlDiff的组件。输出与XmlDiff相同。我将其卸载。
  • Araxis不仅仅是一种传统的文本差异工具,它还可以比较二进制文件,图像文件,文件夹和Word文件。我非常喜欢除XML以外的任何差异任务,因为它不支持XML差异选项。
  • Altova DiffDog看起来像一个复杂的商业产品,它确实包含一个忽略元素顺序的选项,这对我来说是关键特性。但是在尝试使用相同的真实.resx文件(1295行,根据我的经验来看不是一个大文件)后,我发现如果两个元素位于非常不同的位置,则"忽略元素顺序"将不能很好地工作在两个文件中。
  • 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
说明了我们如何通过LINQ的data / @ name属性对resx文件进行排序。太奇妙了。核心代码只是一个由多个LINQ组成的语句。

然后我还发现该线程中另一个答案指出的ResXResourceManager,作者回复了上面的代码项目文章并将功能添加到ResXResourceManager中,在ResxResourceManager中,我们可以将插件配置为在以下情况下自动对resx文件进行排序:之前),将其保存在配置标签中。我们甚至可以选择排序选项:CurrentCulture,Ordinal或者IgnoreCase等。

不幸的是,代码项目解决方案和ResXResourceManager解决方案产生不同的结果,来源可用。我发现,代码项目解决方案将" >>"属性值视为普通文本,因此将语义相关的小部件分开。可以通过在LINQ上添加TrimStart('>')轻松解决此问题。

但是,修复此问题后,这两个工具仍会产生不同的结果。默认情况下,问题的根源是LINQ,使用CurrentCulture对字符串进行排序,而我完全忽略了resXResourceManager中的最新排序选项,对于此问题,我认为最好的排序选项是"顺序"。将sort选项添加到代码项目解决方案中,并在ResXResourceManager中设置相同的sort选项之后,最终它们会产生完全相同的结果!

尽管resxResourceManager非常适合集中管理资源和解决resx元素顺序问题,但是代码项目工具对我来说仍然很有价值,因为它是独立的,因此可以在更广泛的情况下使用。另外,代码非常简洁明了。

我会在更新结束时添加另一个注释,我使用tortoise 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版本比较。