Массив Savon / путаница с хэшами - PullRequest
0 голосов
/ 17 октября 2018

При синтаксическом анализе xml

<MessageList>
  <TradeMessage ID="4850644"/>
  <TradeMessage ID="4850666"/>
  <TradeMessage ID="4850667"/>
  <TradeMessage ID="4850712"/>
</MessageList>

возвращается хеш {MessageList: TradeMessage: [{@id: '123'},...,{@id: '456'}]}

Но если xml будет выглядеть как

<MessageList>
  <TradeMessage ID="4850644"/>
</MessageList>

Будет возвращено {MessageList: TradeMessage: {@id: '123'}}

Так что я не могу перебрать список сообщений, потому что это может быть хеш или массив.

Мой код для обхода массива:

t[:message_list][:trade_message].each do |m|
  TradeMessage.create(id: m[:@id])
end

Что делать в такой ситуации?Должен ли я сменить xml-парсер с deafult nokogiri на что-то еще?

Обновление: Я заметил, что Hash.from_xml (string) возвращает хэш, подобный массиву savon - массив, если несколько тегов, хэшесли один тег.

Мое решение: использовать документ nokogiri для анализа ответа савона response.doc

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете использовать оператор сплайта в Ruby.Он всегда будет возвращать массив.Пожалуйста, смотрите ниже для крайнего простого примера.

require 'awesome_print'

def return_array(elements)
  return *elements
end

ap return_array([:a, :b, :c])
ap return_array(:d)
0 голосов
/ 17 октября 2018

Если это поведение Савона по умолчанию, я бы посоветовал посмотреть на тип результата, который вы получаете, и проанализировать оттуда:

if t[:message_list][:trade_message].is_a?(Array) # or perhaps `t[:message_list][:trade_message].respond_to?(:each)`
  t[:message_list][:trade_message].each { |m| TradeMessage.create(id: m[:@id]) }
else
  TradeMessage.create(id: t[:message_list][:trade_message][:@id])
end

В качестве альтернативы, вы можете обернуть результат в массив, если он еще не одини обработайте аналогично:

t[:message_list][:trade_message].is_a?(Array) ? t[:message_list][:trade_message] : [t[:message_list][:trade_message]]
t[:message_list][:trade_message].each { |m| TradeMessage.create(id: m[:@id]) }

Странное поведение из драгоценного камня, хотя.Возможно, стоит заглянуть в их документы, чтобы узнать, есть ли что-то, что вы можете использовать, чтобы изменить это поведение.

Если нет, надеюсь, это поможет.Дайте мне знать, если у вас есть какие-либо вопросы.

...