Я пытаюсь создать более быстрый парсер для SOAP API, который превратит xml в хэш, и сопоставление ключей с загруженной памятью схемой на основе Структура YML. Я использовал Нори для разбора XML в хэш:Лучший способ получить значения из совпадающих ключей в рубиновом хеше
hash1 = { :key1 => { :@attr1=> "value1", :key2 => { :@attribute2 => "value2" }}}
(старый синтаксис рубиновый, чтобы сохранить атрибуты из ключей ясно)
Между тем у меня есть константа, которая загружается в память и сохраняет соответствующие ключи необходимо для моих действий:
hash2 = {:key1 => { :key2 => { :@attribute2 => nil }}}
(старый синтаксис рубин, чтобы сохранить атрибуты из ключей ясно)
Мне нужно совместить первый хэш со вторым, самым эффективным способом. Согласно моему пониманию, есть способы сделать это:
перебрать два хэш-ключей в то же время, но используя второй в качестве происхождения: (? Многострочного синтаксис, ¿ясный)
def iterate(hash2, hash1)
hash2.each do |k, v|
if v.is_a? Hash
iterate(hash2[k], hash1[k])
else
hash2[k] = hash1[k]
end
end
end
Некоторые вопросы приходят на ум:
- есть ли более эффективный способ сделать это без того, чтобы перебирать все мои ключи?
- Это более эффективно, чем доступ к ключам напрямую?
- Есть ли лучший способ проанализировать XML в хэш, используя hash2 внутри шаблона посетителя?
Я не думает, что вы можете избежать итерации, когда у вас есть вложенные хэши, которые требуют рекурсию ... мне кажется, как только третий вопрос (редизайн) можно было бы изучить более эффективный путь ... может быть, есть способ избежать необходимости соответствовать хэшам ...? Или вы можете использовать StringScanner и написать свой собственный парсер ... – Myst