我有一个XML文件(实际上是一个Visual C#项目文件),我想用Ruby脚本来操作它。我想将XML读入内存,对它们做一些工作,包括更改一些属性和一些文本(修复一些路径引用),然后将XML文件写回。这不是那么难。
困难的部分是,我希望我写的文件看起来与我读到的文件相同,除非我做了更改。如果输入文件使用双引号,我希望输出使用双引号。如果输入在/>
之前有空格,我希望输出执行相同的操作。基本上,我希望输出与输入相同,除非我明确地进行了更改(在我的情况下,它只是属性值,或者是元素的文本内容)。
我想要最小的差异,因为这个项目文件被检入版本控制 - 并且因为下次我在Visual Studio中进行更改时,它将以其首选格式重写它。我想避免检查一堆无意义的差异,然后在不久的将来再次改变。在我提交Ruby脚本的更改之前,我还想避免在Visual Studio中打开项目,进行更改和保存。我希望我的Ruby脚本只需进行更改,仅此而已。
我最初只使用正则表达式解析了该文件,但遇到了我真正需要XML库的情况,因为我需要了解有关子元素的更多信息。所以我切换到了REXML。但它对我的格式进行了以下不良改动:
'
)。/>
之前的空格。我正在通过对REXML的输出进行一堆gsub
调用来解决这个问题,但是有一个Ruby XML操作库更适合“最小差异”场景吗?
答案 0 :(得分:1)
您可以构建自己的SAX解析器(例如,使用Nokogiri,这非常容易,我建议使用它)来解析XML文件,更改其中的一些数据,并刷新处理后的XML文件您自己定制的,从头开始构建的XML生成器。坏消息是,在这种情况下,你必须构建一个小的XML库和生成器例程,所以这不是一项普通的任务。
另一种方式:不构建SAX解析器,而是编写XML生成器。使用您喜欢的库解析XML,更改您需要更改的内容并生成您想要的任何内容。您只需递归遍历文档中的所有节点,并在约定范围内输出它们。