0

ビルダー テンプレートを使用して大きな XML ドキュメントを生成する Ruby on Rails アプリに取り組んでいますが、ちょっとしたつまずき点にぶつかりました。

XML 出力には、ファイル サイズ (バイト単位) を含むフィールドが必要です。基本的には、http 応答の「Content-Length」ヘッダーに入力される値を使用する必要があると思いますが、タグの値を更新すると明らかにファイル サイズが変わります。

出力は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <metadata>
    <filesize>FILESIZE</filesize>
    <filename>FILENAME.xml</filename>
  </metadata>
    <data>
    .
    .
    .
    </data>
</dataset>

ビルダー テンプレートを使用して XML タグにファイル サイズを追加することはできますか? そうでない場合、必要な結果を得るために使用できる方法はありますか?

4

1 に答える 1

0

Garrett のおかげで、次の (醜い) 解決策を思いつくことができました。間違いなく改善が必要ですが、うまくいきます。

class XmlMetaInjector
  require 'nokogiri'

  def initialize(app)  
    @app = app  
  end  

  def call(env)  
    status, headers, response = @app.call(env)  
    if headers['Content-Type'].include? 'application/xml'
      content_length = headers['Content-Length'].to_i # find the original content length

      doc = Nokogiri::XML(response.body)
      doc.xpath('/xmlns:path/xmlns:to/xmlns:node', 'xmlns' => 'http://namespace.com/').each do |node|
         # ugly method to determine content_length; if this happens more than once we're in trouble
        content_length = content_length + (content_length.to_s.length - node.content.length)
        node.content = content_length
      end

      # update the header to reflect the new content length
      headers['Content-Length'] = content_length.to_s

      [status, headers, doc.to_xml]  
    else  
      [status, headers, response]  
    end 
  end # call(env)
end
于 2010-09-30T23:35:30.667 に答える