Настройте Rails Hash.from_xml с пользовательским преобразованием - PullRequest
0 голосов
/ 19 июля 2010

Я хочу преобразовать свой XML-документ в Hash в Ruby / Rails. На самом деле, преобразование по умолчанию Hash.from_xml в Rails работает для меня, за исключением одного случая.

У меня есть список элементов, содержащихся в элементе <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, мне кажется неправильным реализовывать всю процедуру преобразования, где она могла бы быть реализована тысячу раз.

Еще одна небольшая заметка, Hash.to_xml также заменяет все черточки подчеркиванием. Есть ли способ предотвратить эту замену?

1 Ответ

0 голосов
/ 19 июля 2010

Это правильное поведение.

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

Подумайте о том, как это будет преобразовываться в хеш, для клавиши 'b' не может быть двух значений.Единственное решение состоит в том, чтобы сделать значение 'b' хешем, содержащим массив 'one' и 'two'.

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

Это просто то, как Rails представляет XML.Вам нужно будет проверить значение массива в хэше и действовать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...