如何比较两个(或更多)大型 .resx 文件的内容?每个文件中有数百个名称/值对,查看组合版本会非常有帮助。我对存在于中性文化中但未在特定文化版本中指定的名称/值对特别感兴趣。
7 回答
有一个很棒的免费软件工具可以编辑 resx 文件,您可以在其中一次查看多种语言并清楚地看到缺少或额外的内容 - Zeta 资源编辑器
虽然它本身不是一个差异工具,但RESX Synchronizer可以帮助您。它的主要用途是使用中性语言的新条目更新本地化的 .resx 文件,并删除所有已删除的项目。
可能,通过 /v 命令行开关使用它生成的输出将是您需要的。否则,它确实带有完整的 C# 源代码,因此您可以根据需要对其进行调整。
对于较新版本的 Visual Studio (2010+),现在有一个名为ResXManager的 Visual Studio 扩展(由tomengler创建),这非常棒。
它允许您并排查看每种语言的每个资源,并突出显示缺失的资源。(以下示例来自扩展下载页面。)
如果匹配的元素在两个文件中出现的顺序不同,那么对 XML 文件使用简单的 diff 可能完全没用。我也一直在寻找特定于 XML 的差异工具,但到目前为止没有成功。
与此同时,我一直在使用的解决方法是:
.resx
在 Visual Studio 中打开文件。- 选择所有 [ Ctrl+ A] 并剪切 [ Ctrl+ X](对于大文件,这可能需要一段时间 - 请耐心等待)
- 粘贴 [ Ctrl+ V] 并保存(这将重新创建
.resx
按键排序的文件)
当这两个文件都被重新排序时,正常的差异变得容易得多。您现在可以通过浏览差异来快速找到丢失的键。
我已经尝试了几个 XML 差异工具。这是摘要(促使我评估它的要求是区分 Visual Studio 生成的.resx
资源文件,我认为这是微软犯的一个大错误——元素的顺序是随机的,Windows 窗体总是重写 ImageStream如果您只是更改按钮的位置而不对 imageList 执行任何操作)。
- 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 文件 diff,使用起来并不容易。
XML Notepad 有一个简单的内置 XML diff。根据输出窗口,我认为它在内部使用了 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 表明我们可以轻松地按数据对 resx 文件进行排序/@ LINQ 的名称属性。太奇妙了。核心代码只是由几个 LINQ 组成的一条语句。
然后我也发现了ResXResourceManager,这个帖子的另一个回答指出了这个问题,作者回复了上面的代码项目文章并将功能添加到ResXResourceManager,在ResxResourceManager中,你可以配置插件自动排序resx文件when(之前)您将其保存在配置选项卡中。您甚至可以选择排序选项:CurrentCulture、Ordinal 或 IgnoreCase 等。
不幸的是,代码项目解决方案和 ResXResourceManager 解决方案产生了不同的结果,源可用,我发现代码项目解决方案处理“>>” 属性值作为普通文本,因此语义相关的小部件是分开的。这可以通过向 LINQ 添加 TrimStart('>') 轻松解决。
但是,修复此问题后,这两个工具仍然会产生不同的结果。罪魁祸首是默认情况下使用 CurrentCulture 对字符串进行排序的 LINQ,我完全忽略了 resXResourceManager 中的相关排序选项,对于这个问题,我认为最好的排序选项是“Ordinal”。将排序选项添加到代码项目解决方案中,并在 ResXResourceManager 中设置相同的排序选项后,最终它们会产生完全相同的结果!
虽然 resxResourceManager 非常适合集中管理资源并修复 resx 元素顺序问题,但代码项目工具对我来说仍然是无价的,因为它是独立的,因此可以在更广泛的情况下使用;另外,代码非常简洁和优雅。
我会在更新结束时添加另一个注释,我使用乌龟 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 修订比较。
您可以使用 XML Diff 编写代码。请参阅在应用程序中使用 XML 差异和补丁工具。
您可以使用 TortoiseSVN 的 diff 之类的工具(如果您使用的是 Windows)。只需选择两个文件,右键单击,然后从 TortoiseSVN 子菜单中选择“diff”。