2013-03-08 3 views
1

Я пытаюсь захватить записи журнала событий, которые передаются в xlm, конвертировать их в хэш, а затем хранить в базе данных.Доступ к хешу хеш-памяти в Ruby

В настоящее время я использую XmlSimple gem, чтобы преобразовать вход xml в хэш.

Тест входного образца:

require 'xmlsimple' 

h = XmlSimple.xml_in(' 
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
    <System> 
    <Provider Name="Service Control Manager" Guid="{555908d1-a6d7-4695-8e1e-26931d2012f4}" EventSourceName="Service Control Manager" /> 
    </System> 
</Event> 
', { 'KeyAttr' => 'name' }) 


puts "#{h}" 

Это возвращает:

{"xmlns"=>"http://schemas.microsoft.com/win/2004/08/events/event", "System"=>[{"Provider"=>[{"Name"=>"Service Control Manager", "Guid"=>"{555908d1-a6d7-4695-8e1e-26931d2012f4}", "EventSourceName"=>"Service Control Manager"}]}]} 

Как я могу получить доступ к системе поставщика GUID?

я могу вернуть все элементы системы, выполнив:

puts "#{h['System']}" 

Однако

puts "#{h['System']['Provider'}" 

Возвращает:

can't convert String into Integer (TypeError) 

Я попытался заливкой результат в строку с не повезло. У меня неправильное форматирование XmlSimple? Имею ли я доступ к неправильному ключу? Есть ли другой способ сделать это?

Спасибо за помощь!

ответ

1

[] в начале "System" означает, что его значение является массивом хешей. Вы можете сделать это:

puts "#{h['System'][0]['Provider'}" 

в то же время "Provider" сам массив, так что вы должны сделать то же самое для него, например:

puts "#{h['System'][0]['Provider'][0]['Guid']" 
+0

Спасибо! Я не заметил этого! puts "# {h ['System'] [0] ['Provider'] [0] ['Guid']}« Дает мне значение GUID, которое я получил после. – Michael

1

Похоже, вы просто не заметили закрытия ]. Хеши должны без проблем быть гнездовыми.

1

h['System'] - это массив. Использование:

h['System'][0]['Provider'] 
1

быть осторожным массивов

h["System"].first["Provider"].first["Guid"] 
Смежные вопросы