如何查看节点集的每个项目?

时间:2013-04-03 12:34:38

标签: ruby-on-rails ruby xpath xml-parsing nokogiri

我正在从API解析XML并在一个页面上显示它们,尽管我已经将它们分页到每页30个。

我希望使用link_to方法单独查看每个属性,然后更新属性,然后可以将这些属性发送回XML格式的API。我不做的是保存到模型,只是显示。我可以将返回的结果视为对象吗?

这是XML:

<entry>
<id>xxx</id>
<updated>xxx</updated> 
<category  scheme="xxx"  term="xxx"/>
<title type="text">xxx</title>
<link rel="xxx" type="xxx"    href="xxx"/> 
<link rel="xxx"/>     
<link rel="xx" type="xxx" href="xxx"/> <link rel="xx" type="axx" href="xxx"/> 
<gd:email rel="xxx" address="xxx" primary="xx"/> 
</entry>

这是控制器:

def show
  @contact = getcontact.find(params[:title])
end

这是getcontact方法:

doc = Nokogiri::XML.parse(open(url))
doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]')

这是路线:

match 'contacts/xmlns:title' => 'contacts#show'

所有联系人视图:

<% @mycontacts.each do |c| %>
Name: <%= c.xpath('xmlns:title').text %>  
Email: <%= c.xpath('gd:email/@address').text %> 
<%= link_to "Update Contact", contact_path(c.xpath('xmlns:title').text) %></p> 

<% end %>

显示视图:

<%= @contact.xpath('xmlns:title') %>
<%= @contact.xpath('gd:email/@address') %>

当我点击链接查看单个联系人时,收到错误消息:

undefined method `xpath' for #<Enumerator:0x3cc6570>

编辑:

将所有内容保存到模型中,在应用程序中更新,然后转换为XML并将其发回给它会更好吗?这看起来有点长,但这是最好的做法吗?

1 个答案:

答案 0 :(得分:1)

是的,我会创建一个封装API和检索方法的模型。另外,我会使用专为此用例设计的HTTParty。它将自动与XML进行转换。 (虽然如果这是RSS提要,我可能会使用dedicated RSS parser

这种分离不会“长篇大论”,实际上它会更清晰,效率更高,因为你可以缓存甚至只是memoize在模型中,最大限度地减少你必须做的提取量