用于以最小差异操作 XML 的 Ruby 库?

标签 ruby xml

我有一个 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/

相关文章:

c# - 非常慢的 WebResponse 触发超时

xml - 使用 xpathSApply 在 R 中抓取 XML 属性

xml - android View 中经常出现的问题,解析XML时出错: unbound prefix

ruby-on-rails - 在 Rails before_save 方法中将多个属性大写

ruby-on-rails - 如何在 Ruby 中检查默认单选按钮?

ruby - 如何将二进制文件或任何文件传输到远程服务器? - ruby

xml - Puppet Augeas - 无法更新包含 CDATA 的 xml 节点中的值

ruby-on-rails - rails 4——用户预期,得到字符串

ruby - 在数组的数组上使用 Enumerable#zip

xml - 如何在 Scala 中处理 XML 字符引用?