如何将Ruby哈希表转换为XML?

38

这是我最终需要的具体 XML:

<?xml version="1.0" encoding="UTF-8"?>
<customer>
  <email>joe@example.com</email>
  <first_name>Joe</first_name>
  <last_name>Blow</last_name>
</customer>

假设我有一个控制器(Ruby on Rails),正在将数据发送到一个方法中。我希望像这样发送它作为一个哈希值:

:first_name => 'Joe',
:last_name => 'Blow',
:email => 'joe@example.com'

那么,我该如何将哈希转换为XML格式?

5个回答

74

ActiveSupport为Hash添加了一个to_xml方法,因此您可以使用以下代码实现类似的效果:

sudo gem install activesupport

require "active_support/core_ext"

my_hash = { :first_name => 'Joe', :last_name => 'Blow', :email => 'joe@example.com'}
my_hash.to_xml(:root => 'customer')

最终得到:

<?xml version="1.0" encoding="UTF-8"?>
<customer>  
   <last-name>Blow</last-name>  
   <first-name>Joe</first-name>  
   <email>joe@example.com</email>
</customer>

请注意下划线会被转换为破折号。


啊,好的,原始选项让我有些困惑。谢谢! - Shpigford
如何使用此方法向XML元素添加属性? - doremi
4
为了使用Hash#to_xml,你需要执行sudo gem install activesupport命令,并在代码中添加require "active_support/core_ext"语句。请注意,翻译过程中不能改变原文的含义,并且不提供解释或其他非翻译相关的内容。 - Mirek Rusin
2
从Rails 3.0开始,to_xml不再在ActiveSupport中,而是作为Ruby的Hash和Array类的方法添加。 - Les Nightingill

6

宝石 很好。

Gyoku.xml(:lower_camel_case => "key")    
# => "<lowerCamelCase>key</lowerCamelCase>"

Gyoku.xml({ :camel_case => "key" }, { :key_converter => :camelcase })
# => "<CamelCase>key</CamelCase>"

Gyoku.xml({ acronym_abc: "value" }, key_converter: lambda { |key| key.camelize(:lower) })
# => "<acronymABC>value</acronymABC>"

以及更多有用的选项。


很棒的帖子,您知道有什么 Gem 可以转换为 JSON 吗? - Alejandro Montilla

3

如果这些数据是一个模型,可以考虑重写to_xml方法。

否则,Builder 是个不错的选择。


1
好的,我已经尝试了to_xml方法,但它在我的XML周围添加了一个<hash>标签。例如: <hash> <customer> ... </customer> </hash> - Shpigford
您的客户哈希是活跃记录对象吗? - bensie
1
请查看 http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html#M001876 ,了解如何覆盖以您所需的方式构建 XML 的相关信息。 - bensie

3
我建议使用像XmlSimple这样的宝石,它提供了这种功能。

这对我起了作用,因为我没有使用Rails。以下是将散列表转换成XML的一行代码:XmlSimple.xml_out(hash, {:keeproot => true, :noescape => true}) - DV.

2

我曾在我的大学做过一次关于这个话题的简短演讲。 这里是幻灯片(有趣的部分从第37页开始)


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