我正在开发一个ruby on rails app,它使用构建器模板生成一个大型XML文档,但我有点磕磕绊绊。
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标记中添加文件大小?如果没有,是否有一些方法可以用来达到要求的结果?
答案 0 :(得分: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