使用自定义转换自定义Rails Hash.from_xml

时间:2010-07-19 17:11:19

标签: ruby-on-rails ruby xml parsing hash

我想将我的XML文档转换为Ruby / Rails中的Hash。实际上,除了一种情况外,Rails中Hash.from_xml的默认转换对我有用。

我有<item-list>元素中包含的项目列表,但这些项目可以是不同类型的。例如,standard-itemspecial-item,每个都有不同的子元素集。

<item-list>
  <standard-item>
    <foo>...</foo>
    <bar>...</bar>
  </standard-item>
  <standard-item>
    <foo>...</foo>
    <bar>...</bar>
  </special-item>
  <special-item>
    <baz>...</baz>
  </special-item>
</item-list>

这种XML结构可能会让Hash.from_xml感到困惑,因为它不知道标准项和特殊项都是项,而且应该在同一级别。因此,从上面的XML中,Hash.from_xml生成的哈希将是:

{ 'item-list' => { 'standard-item' => [ { 'foo' => '...', 'bar' => '...' },
                                        { 'foo' => '...', 'bar' => '...' } ],
                   'special-item'  => { 'baz' => '...' } }}

但我想要的是将所有项目作为列表成员,如下所示:

{ 'item-list' => [ { 'standard-item' => { 'foo' => '...', 'bar' => '...' } },
                   { 'standard-item' => { 'foo' => '...', 'bar' => '...' } },
                   { 'special-item'  => { 'baz' => '...' } } ]

是否可以扩展/自定义from_xml,以便它能够以我想要的方式执行此操作?如果不可能,实现这一目标的最佳方法是什么?鉴于这是唯一包含偏离一般XML-to-Hash转换的元素,我似乎不适合实现整个转换例程,它可能已经实现了一千次。

另一个小注释,Hash.to_xml也用下划线替换所有短划线。有没有办法防止这种替换?

1 个答案:

答案 0 :(得分:0)

这是正确的行为。

<a>
  <b>one</b>
  <b>two</b>
</a>

考虑一下这将如何转换为哈希值,不能将两个值分配给键'b'。唯一的解决方案是使'b'的值成为包含'one'和'two'数组的哈希值。

{a => {
  b => ['one', 'two']
}}

这简直就是Rails如何表示XML。您需要检查哈希中的数组值,并采取相应的行动。