如何比较多个.resx文件?
如何比较两个(或者多个)大.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版本比较。