Могу ли я добавить размер файла в вывод Builder XML - PullRequest
0 голосов
/ 30 сентября 2010

Я работаю над приложением ruby ​​on rails, которое генерирует большой XML-документ с использованием шаблона компоновщика, но я немного наткнулся на точку преткновения.

Вывод XML должен содержать полесодержит размер файла в байтах.Я думаю, что в основном мне нужно будет использовать значение, которое будет заполнять заголовок «Content-Length» в ответе http, но обновление значения тега, очевидно, изменит размер файла.

Вывод долженвыглядит примерно так:

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

Возможно ли добавить размер файла в тег XML с помощью шаблона компоновщика?Если нет, есть ли какой-нибудь метод, который я мог бы использовать для достижения требуемого результата?

1 Ответ

0 голосов
/ 01 октября 2010

Благодаря Гарретту я смог придумать следующее (некрасивое) решение, оно определенно нуждается в улучшении, но оно работает:

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
...