【发布时间】:2011-03-18 00:44:04
【问题描述】:
我想在 Ruby/Rails 中将我的 XML 文档转换为 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 到哈希转换不同的内容的元素,我似乎不适合实现可能已经实现了一千次的整个转换例程。
另一个小注释,Hash.to_xml 也将所有破折号替换为下划线。有没有办法防止这种替换?
【问题讨论】:
-
你在这里定义的不是合法的哈希——你不能有两个相同的键,因为当你调用 hash['standard-item'] 时它不知道要拉哪个,等等。你可能想要重新制定它以便获得一个二维数组,或者获得一个数组,其中 e'standard_item' 是 subhash 中的一个值?
-
感谢您的指出。我忘了还在数组中的子元素周围加上大括号。它们应该是像你所说的那样的子哈希。
-
您的代码中也有错字。第一个
</special-item>应该是</standard-item>,而不是。 (你可能没有使用这个确切的代码来测试Hash.from_xml,因为它会导致解析错误。)
标签: ruby-on-rails ruby xml parsing hash