如何在RoR中向用户显示现有的XML文件

4
我有一个xml文件,希望将其原样显示给用户,即保留标签。在RoR中应该如何操作?
我尝试过render :file=>"/path/to/file.xml",但标签<product>消失了。
//file.xml
<product>car</product>

更新:我发现这种行为取决于浏览器

  • Mozilla/5.0(X11;U;Linux i686;en-US;rv:1.9.0.3)Gecko/2008101315 Ubuntu/8.10(intrepid)Firefox/3.0.3

    标签被保留。

  • Mozilla/5.0(Windows;U;Windows NT 5.1;zh-CN;rv:1.9.0.15)Gecko/2009101601 Firefox/3.0.15

    标签消失了。

4个回答

7

您是否尝试添加

:content_type => 'application/xml'

你的渲染行是什么?

render :file=>"/path/to/file.xml", :content_type => 'application/xml'

哇,进一步的研究表明,确实是浏览器在这里阻碍了进展。IE8(值得一提的是)按预期显示xml。就我所知,根据我的谷歌搜索结果,这似乎是Mozilla内部关于什么是正确的事情[tm]的宗教战争。看来你在这里迷失了,抱歉。 - jhwist
进一步调查表明,每当远程的XML文件看起来像HTML(通过标签名称,在我的测试中使用http://www.w3schools.com/xmL/note.xml有一个“body”标签)时,Windows Firefox(或者可能只是Gecko/2009101601,这也是我所拥有的)仅呈现文本,而不是元素。 - jhwist

3
不同的浏览器对XML的显示方式有所不同。有些浏览器尝试着变得“聪明”,有些则没有。你不能依赖它们。如果你想要原样显示XML,你需要将经过转义的XML呈现为文本。
在你的控制器操作中,你需要调用以下内容:
render :text => @template.h(File.read("/path/to/file.xml"))

这将为您转义所有HTML并作为纯文本处理。

在Rails v3.2.20中,这在控制器中不再起作用。然而,render :text=>xml_string.html_safe, :content_type=>'application/xml'是有效的。 - spyle

0
在文件中添加一个XML prolog行(除了jhwist的内容类型建议之外)。
<?xml version="1.0"?>

0

或者更好的是

render :text => File.read("/path/to/file.xml"), :content_type => 'application/xml'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接