我正在使用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)

09-25 21:59