如何比较多个.resx文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何比较多个.resx文件?相关的知识,希望对你有一定的参考价值。
如何比较两个(或更多)大.resx文件的内容?每个文件中有数百个名称/值对,查看组合版本非常有用。我对中性文化中存在的名称/值对特别感兴趣,但在文化特定版本中也没有指定。
有一个伟大的免费软件工具来编辑resx文件,你可以一次看到多种语言,清楚地看到缺少或额外的 - Zeta Resource Editor
虽然它本身不是一个差异工具,但RESX Synchronizer可能会帮助你。它的主要用途是使用中性语言中的新条目更新本地化的.resx文件,并删除所有已删除的项目。
可能,使用/ v命令行开关生成的输出将是您所需要的。否则,它确实带有完整的C#源代码,因此您可以根据需要调整它。
我尝试了几种XMl diff工具。这是总结(推动我评估它的要求是为了区分Visual Studio生成的.resx
资源文件,我认为这是微软制造的一个大错误 - 元素的顺序是随机的,Windows Forms总是重写如果您只是更改按钮的位置而不对imageList执行任何操作,则为ImageStream。
- 的xmldiff
- Araxis
- Altova DiffDog
- XML Notepad
- ExamXML
- 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 Notepad有一个简单的内置XML差异。根据输出窗口,我认为它在内部使用XmlDiff的组件。输出与XmlDiff相同。我会卸载它。
- Araxis更像是一种传统的文本差异工具,它还可以比较二进制文件,图像文件,文件夹和word文件。我非常喜欢除XML之外的任何diff任务,因为它没有支持XML的diff选项支持。
- 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('>')可以很容易地解决这个问题。
然而,在固定之后,这两个工具仍然产生不同的结果。 culprint默认使用CurrentCulture来排序字符串LINQ,我完全忽略了resXResourceManager中的indlant sort选项,对于这个问题,我认为最好的排序选项是“Ordinal”。将sort选项添加到代码项目解决方案,并在ResXResourceManager中设置相同的排序选项后,最终它们会产生完全相同的结果!
尽管resxResourceManager非常适合集中管理资源并修复resx元素顺序问题,但代码项目工具对我来说仍然非常宝贵,因为它是独立的,因此它可以在更广泛的情况下使用;此外,代码非常简洁优雅。
我会在我的更新结尾添加另一个注释,我使用togise 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表示foward,第一个文件名是输入文件,第二个文件名是过滤器应该写的输出文件,第三个文件名可以安全地忽略。在对代码项目代码进行一些更改之后,我现在可以编译一个过滤器程序,将其与Araxis进行对比,并对旧的,混乱的resx文件进行合理的resx修订比较。
如果匹配元素在两个文件中的出现顺序不同,那么在XML文件上使用简单的diff就完全没用了。我一直在寻找一种特定于XML的差异工具,到目前为止还没有成功。
与此同时,我一直在使用的解决方法是:
- 在Visual Studio中打开
.resx
文件。 - 选择全部[Ctrl + A]并剪切[Ctrl + X](对于大文件可能需要一段时间 - 请耐心等待)
- 粘贴[Ctrl + V]并保存(这将重新创建按键排序的
.resx
文件)
当这两个文件因此被重新排序时,正常的差异变得更加容易。您现在可以通过浏览差异来快速找到丢失的键。
对于较新版本的Visual Studio(2010+),现在有一个名为ResXManager的Visual Studio扩展(由tomenglert创建),这对此非常了不起。
它允许您并排查看每种语言中的每个资源,并突出显示缺少的资源。 (以下示例来自扩展下载页面。)
您可以使用XML Diff编写代码。见Using the XML Diff and Patch Tool in Your Applications。
您可以使用TortoiseSVN的差异工具(如果您使用的是Windows)。只需选择两个文件,右键单击,然后从TortoiseSVN子菜单中选择“diff”。
以上是关于如何比较多个.resx文件?的主要内容,如果未能解决你的问题,请参考以下文章
WINFORM 如何利用代码动态把资源加入到resources.resx
如何在 javascript 文件中使用 resx 文件。 .net 核心 3.1 mvc