如何比较两个(或更多)大型.resx文件的内容?每个文件中有数百个名称/值对,查看组合版本非常有用.我对中性文化中存在的名称/值对特别感兴趣,但在文化特定版本中也没有指定.
有一个伟大的免费软件工具来编辑resx文件,你可以一次看到多种语言,清楚地看到缺少或额外的东西 - Zeta资源编辑器
虽然它本身不是差异工具,但RESX Synchronizer可以帮助你.它的主要用途是使用中性语言中的新条目更新本地化的.resx文件,并删除所有已删除的项目.
可能,使用/ v命令行开关生成的输出将是您所需要的.否则,它确实带有完整的C#源代码,因此您可以根据需要调整它.
如果匹配的元素在两个文件中的显示顺序不同,则对XML文件使用简单的diff可能完全没有用。到目前为止,我也一直在寻找特定于XML的diff工具,但至今没有成功。
同时,我一直在使用的解决方法是:
.resx
在Visual Studio中打开文件。
全选[ Ctrl+ A]并剪切[ Ctrl+ X](大文件可能需要一段时间-请耐心等待)
粘贴[ Ctrl+ V]并保存(这将重新创建.resx
按键排序的文件)
这样,当两个文件都重新排序后,正常的区分变得非常容易。您现在可以通过浏览差异快速找到丢失的键。
对于Visual Studio(2010+)的较新版本,现在有一个名为ResXManager的Visual Studio扩展(由tomenglert创建),为此感到惊讶。
它使您可以并排查看每种语言的每种资源,并突出显示缺少的资源。(以下示例来自扩展下载页面。)
我尝试了几种XMl diff工具.以下是摘要(驱使我评估它的要求是对Visual Studio生成的.resx
资源文件进行区分,我认为这是Microsoft制造的一个大错误 - 元素的顺序是随机的,Windows Forms总是重写ImageStream如果您只是更改按钮的位置而对imageList不执行任何操作.
的xmldiff
Araxis
Altova DiffDog
XML记事本
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显示我们如何通过data/@对resx文件进行排序LINQ的name属性.太奇妙了.核心代码只有一个由几个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修订比较.