2

REXMLを使用してXMLドキュメントを作成しています

File.open(xmlFilename,'w') do |xmlFile|
    xmlDoc = Document.new
    # add stuff to the document...
    xmlDoc.write(xmlFile,4)
end

一部の要素にはかなりの数の引数が含まれているため、それに応じた行はかなり長くなる可能性があります。166文字より長くなると、REXMLは改行を挿入します。もちろん、これはまだ完全に有効なXMLですが、私のワークフローにはいくつかの差分とマージが含まれています。これは、各要素が1行に含まれている場合に最適に機能します。

では、REXMLでこれらの改行を挿入しないようにする方法はありますか?

編集:スクリプトの最後のステップとして、完成したXMLファイルを整理してプッシュすることになりました。誰かがこれを行うためのより良い方法を知っていれば、私はまだ感謝しています。

4

2 に答える 2

3

Ryan Calhounが以前の回答で述べたように、REXMLは折り返し行の長さとして80を使用します。これはバグだと確信しています(ただし、今はバグレポートを見つけることができませんでした)。Formatters :: Prettyクラスのwrite_textメソッドを上書きして、ハードコードされた80の代わりに構成可能な@width属性を使用するように修正することができました。

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)
于 2010-11-19T18:53:26.783 に答える
1

簡単な答え:はい、いいえ。

REXMLは、に指定した値に基づいて異なるフォーマッターを使用しますindent。デフォルトの-1のままにすると、が使用されますREXML::Formatters::Default。4のような値を指定すると、が使用されますREXML::Formatters::Pretty。きれいなフォーマッタには、テキスト(タグや属性ではない)を処理するときに、行を折り返すロジックがあります(ただし、166ではなく80で折り返されるように見えます)。たとえば、

<p> a paragraph tag </p>

80文字でラップされますが、

<a-tag with='a' long='list' of='attributes'/>

ラップされません。

とにかく、80はハードコードされてrexml/formatters/pretty.rbおり、構成できません。また、インデントのないデフォルトのフォーマッタを使用する場合、ほとんどの場合、改行が追加されていない単なる生のダンプです。推移的フォーマッターを試すこともできますが(のドキュメントを参照Document.write)、一部のバージョンのrubyでは壊れており、コードハックが必要になる場合があります。とにかくそれはおそらくあなたが望むものではありません。


Builder::XmlMarkupビルダーの宝石から見てみてください。

于 2010-11-18T03:59:28.383 に答える