我正在使用rexml创建一个xml文档
File.open(xmlFilename,'w') do |xmlFile|
xmlDoc = Document.new
# add stuff to the document...
xmlDoc.write(xmlFile,4)
end
有些元素包含相当多的参数,因此,相应的行可能会很长。如果长度超过166个字符,rexml将插入换行符。当然,这仍然是完全有效的xml,但是我的工作流包含一些扩散和合并,如果每个元素都包含在一行中,则效果最佳。
那么,有没有办法让rexml不插入这些换行符?
编辑:作为脚本的最后一步,我最终通过tidy推送完成的xml文件。如果有人知道更好的方法,我仍然会感激。
最佳答案
正如ryan calhoun在之前的回答中所说,rexml使用80作为它的包装线长度。我很确定这是一个bug(尽管我刚才找不到bug报告)。我可以通过重写formatters::pretty类的write_text方法来修复它,这样它就使用了可配置的@width属性,而不是硬编码的80。
require "rubygems"
require "rexml/document"
include REXML
long_xml = "<root><tag>As Ryan Calhoun said in his previous answer, REXML uses 80 as its wrap line length. I'm pretty sure this is a bug (although I couldn't find a bug report just now). I was able to *fix* it by overwriting the Formatters::Pretty class's write_text method.</tag></root>"
xml = Document.new(long_xml)
#fix bug in REXML::Formatters::Pretty
class MyPrecious < REXML::Formatters::Pretty
def write_text( node, output )
s = node.to_s()
s.gsub!(/\s/,' ')
s.squeeze!(" ")
#The Pretty formatter code mistakenly used 80 instead of the @width variable
#s = wrap(s, 80-@level)
s = wrap(s, @width-@level)
s = indent_text(s, @level, " ", true)
output << (' '*@level + s)
end
end
printer = MyPrecious.new(5)
printer.width = 1000
printer.compact = true
printer.write(xml, STDOUT)