Rails XML Feed:ID作为节点属性

时间:2014-03-07 17:13:38

标签: ruby-on-rails ruby xml

我为我们正在使用的供应商(拒绝阅读JSON)设置了一个简单的XML Feed。

<recipes type="array">
  <recipe>
    <id type="integer">1</id>
    <name>
      Hamburgers
    </name>
    <producturl>
      http://test.com
    </producturl>
    ...
  </recipe>
  ...
<recipe>

但是,供应商要求不是拥有id节点,而是父节点中的属性。 e.g。

<recipes type="array">
  <recipe id="1">
    <name>
      Hamburgers
    </name>
    <producturl>
      http://test.com
    </producturl>
    ...
  </recipe>
  ...
<recipe>

我正在建立这个(基本上)

xml_feed = []
recipes.each do |recipe|
  xml_feed <<{id: recipe.id, name: recipe.name, ...}
end
...
render xml: xml_feed.to_xml(root: 'recipes')

但我不确定如何将id(或任何字段)作为属性包含在父节点中。我用Google搜索,找不到任何内容,http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html文档也没有帮助

谢谢!

2 个答案:

答案 0 :(得分:1)

我建议你使用nokogiri宝石。它提供了处理XML

所需的一切
builder = Nokogiri::XML::Builder.new do |xml|
xml.root {
  xml.objects {
    xml.object.classy.thing!
  }
}
end
puts builder.to_xml

<?xml version="1.0"?>
<root>
<objects>
  <object class="classy" id="thing"/>
</objects>
</root>

答案 1 :(得分:1)

使用Nokogiri的建议很好。只是语法应该有点不同,以实现您的要求:

builder = Nokogiri::XML::Builder.new do |xml|
xml.root {
  xml.object('type' => 'Client') {
    xml.name 'John'
  }
}
end
puts builder.to_xml

<?xml version="1.0"?>
<root>
<object type="Client">
  <name>John</name>
</object>
</root>