我有一个 XML 文件(实际上是一个 Visual C# 项目文件),我想使用 Ruby 脚本对其进行操作。我想将 XML 读入内存,对其进行一些处理,包括更改一些属性和一些文本(修复一些路径引用),然后将 XML 文件写回。这并不难。
困难的部分是,我希望我写入的文件看起来与我读入的文件一样,除了我进行了更改的地方。如果输入文件使用双引号,我希望输出使用双引号。如果输入在 />
之前有一个空格,我希望输出也这样做。基本上,我希望输出与输入相同,除了我明确进行了更改的地方(在我的例子中,这只会更改属性值或元素的文本内容)。
我想要最小的差异,因为这个项目文件已 checkin 版本控制——并且因为下次我在 Visual Studio 中进行更改时,无论如何它都会以其首选格式重写它。我想避免检查一堆无意义的差异,这些差异将在不久的将来再次改回。我还想避免必须在 Visual Studio 中打开项目、进行更改并保存,然后才能提交我的 Ruby 脚本的更改。我希望我的 Ruby 脚本只进行更改,仅此而已。
我最初只是用正则表达式解析文件,但遇到了我真的需要 XML 库的情况,因为我需要了解更多关于子元素的信息。所以我切换到 REXML。但它对我的格式进行了以下不良更改:
- 它将所有属性从双引号更改为单引号。
- 它转义了属性值中的所有撇号(将它们更改为
'
)。 - 它删除了
/>
之前的空格。 - 它按字母顺序对每个元素的属性进行排序,而不是保留原始顺序。
我正在通过对 REXML 的输出执行大量 gsub
调用来解决这个问题,但是有没有更适合“最小差异”场景的 Ruby XML 操作库?
最佳答案
您可以构建您自己的 SAX 解析器(例如,使用 Nokogiri,它非常简单,我推荐使用它)来解析您的 XML 文件,更改其中的一些数据,并使用您自己的刷新处理后的 XML 文件定制的、从头开始构建的 XML 生成器。坏消息是,在这种情况下,您必须构建一个小型 XML 库和生成器例程,因此这不是一项普通任务。
另一种方法:不构建 SAX 解析器,而是编写 XML 生成器。使用您最喜欢的库解析 XML,更改您需要更改的内容并生成您想要的任何内容。您只需要递归地遍历文档中的所有节点并在约定范围内输出它们。
关于用于以最小差异操作 XML 的 Ruby 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541830/