【问题标题】:Customize Rails Hash.from_xml with custom conversion使用自定义转换自定义 Rails Hash.from_xml
【发布时间】:2011-03-18 00:44:04
【问题描述】:

我想在 Ruby/Rails 中将我的 XML 文档转换为 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 到哈希转换不同的内容的元素,我似乎不适合实现可能已经实现了一千次的整个转换例程。

另一个小注释,Hash.to_xml 也将所有破折号替换为下划线。有没有办法防止这种替换?

【问题讨论】:

  • 你在这里定义的不是合法的哈希——你不能有两个相同的键,因为当你调用 hash['standard-item'] 时它不知道要拉哪个,等等。你可能想要重新制定它以便获得一个二维数组,或者获得一个数组,其中 e'standard_item' 是 subhash 中的一个值?
  • 感谢您的指出。我忘了还在数组中的子元素周围加上大括号。它们应该是像你所说的那样的子哈希。
  • 您的代码中也有错字。第一个&lt;/special-item&gt; 应该是&lt;/standard-item&gt;,而不是。 (你可能没有使用这个确切的代码来测试Hash.from_xml,因为它会导致解析错误。)

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


【解决方案1】:

这是正确的行为。

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

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

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

这就是 Rails 表示 XML 的简单方式。您需要检查哈希中的数组值,并采取相应措施。

【讨论】:

  • 我知道这是正确的行为。但是,在一种情况下,子元素可以是不同的类型,我希望它们位于单个数组中。例如,假设元素“two”是 而不是 ,但我仍然希望“one”和“two”都在同一个数组中。
  • 再看一遍,就可以了。但是,您可能必须自己使用 Nokogiri 或类似的东西来完成。我认为编写一些代码来抽象 Hash 的结构会更容易,这样它就可以将元素视为处于同一级别。
  • 我这样做的原因是将我的 XML 转换为 JSON 以发送到客户端 JavaScript。给出 hash/JSON 的结构,我想表示给定 XML 的唯一方法是使用 sub-hash?
  • 如果你想保持你的结构,是的,JSON格式的结构与Hash相同。
  • 这也是不一致的,因为下次你只得到一个元素并且哈希值将不再是一个数组。那是怎么回事?仍然是“正确的行为”?
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多