我想将我的XML文档转换为Ruby / Rails中的Hash。实际上,除了一种情况外,Rails中Hash.from_xml的默认转换对我有用。
我有<item-list>
元素中包含的项目列表,但这些项目可以是不同类型的。例如,standard-item
和special-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
也用下划线替换所有短划线。有没有办法防止这种替换?
答案 0 :(得分:0)
这是正确的行为。
<a>
<b>one</b>
<b>two</b>
</a>
考虑一下这将如何转换为哈希值,不能将两个值分配给键'b'。唯一的解决方案是使'b'的值成为包含'one'和'two'数组的哈希值。
{a => {
b => ['one', 'two']
}}
这简直就是Rails如何表示XML。您需要检查哈希中的数组值,并采取相应的行动。