使用REXML保留空格/换行符

时间:2013-04-10 20:54:21

标签: ruby xml whitespace rexml

我正在使用Ruby 1.9.3和REXML来解析XML文档,进行一些更改(添加/减少),然后重新输出文件。在这个文件中是一个看起来像这样的块:

<someElement>
  some.namespace.something1=somevalue1
  some.namespace.something2=somevalue2
  some.namespace.something3=somevalue3
</someElement>

问题在于重写文件后,此块总是看起来像这样:

<someElement>
  some.namespace.something1=somevalue1
  some.namespace.something2=somevalue2 some.namespace.something3=somevalue3
</someElement>

第二个值之后的换行符(但绝不是第一个!)已经丢失并变成了空格。之后,我无法控制或影响的其他一些代码将读取此文件,并根据这些新行来正确解析内容。通常在这种情况下我会使用CDATA来保留空白,但这不是一个选项,因为稍后解析这些数据的代码并不期望一个 - 这个元素的内部文本保持完全原样是至关重要的。

我的读/写代码如下所示:

xmlFile = File.open(myFile)
contents = xmlFile.read
xmlDoc = REXML::Document.new(contents, { :respect_whitespace => :all })
xmlFile.close

{perform some tasks}

out = ""
xmlDoc.write(out, 2)
File.open(filePath, "w"){|file| file.puts(out)}

我正在寻找一种方法来在使用REXML以这种方式读取/写入文件时保留元素之间的文本空白。我已经在这个主题上阅读了关于stackoverflow的其他一些问题,但没有一个能够完全复制这个场景。欢迎任何想法或建议。

1 个答案:

答案 0 :(得分:1)

通过将indent(第二个)参数移到Document.write(),我得到了正确的行为:

#xmlDoc.write(out, 2)
xmlDoc.write(out)

根据我对the docs的解读,这似乎是Document.write()中的一个错误,但是如果你真的不需要设置缩进,那么将其关闭应解决问题。