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

时间:2010-08-22 14:34:24

标签: ruby xml

我有一个XML文件(实际上是一个Visual C#项目文件),我想用Ruby脚本来操作它。我想将XML读入内存,对它们做一些工作,包括更改一些属性和一些文本(修复一些路径引用),然后将XML文件写回。这不是那么难。

困难的部分是,我希望我写的文件看起来与我读到的文件相同,除非我做了更改。如果输入文件使用双引号,我希望输出使用双引号。如果输入在/>之前有空格,我希望输出执行相同的操作。基本上,我希望输出与输入相同,除非我明确地进行了更改(在我的情况下,它只是属性值,或者是元素的文本内容)。

我想要最小的差异,因为这个项目文件被检入版本控制 - 并且因为下次我在Visual Studio中进行更改时,它将以其首选格式重写它。我想避免检查一堆无意义的差异,然后在不久的将来再次改变。在我提交Ruby脚本的更改之前,我还想避免在Visual Studio中打开项目,进行更改和保存。我希望我的Ruby脚本只需进行更改,仅此而已。

我最初只使用正则表达式解析了该文件,但遇到了我真正需要XML库的情况,因为我需要了解有关子元素的更多信息。所以我切换到了REXML。但它对我的格式进行了以下不良改动:

  • 它将所有属性从双引号更改为单引号。
  • 它会转义属性值中的所有撇号(将它们更改为')。
  • 删除/>之前的空格。
  • 它按字母顺序对每个元素的属性进行排序,而不是保留原始顺序。

我正在通过对REXML的输出进行一堆gsub调用来解决这个问题,但是有一个Ruby XML操作库更适合“最小差异”场景吗?

1 个答案:

答案 0 :(得分:1)

您可以构建自己的SAX解析器(例如,使用Nokogiri,这非常容易,我建议使用它)来解析XML文件,更改其中的一些数据,并刷新处理后的XML文件您自己定制的,从头开始构建的XML生成器。坏消息是,在这种情况下,你必须构建一个小的XML库和生成器例程,所以这不是一项普通的任务。

另一种方式:不构建SAX解析器,而是编写XML生成器。使用您喜欢的库解析XML,更改您需要更改的内容并生成您想要的任何内容。您只需递归遍历文档中的所有节点,并在约定范围内输出它们。