Хобрук: Ваш путь к мастерству в программировании

Доступ к Hash of Hash of Hash в Ruby

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

В настоящее время я использую драгоценный камень XmlSimple для преобразования ввода 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? Я обращаюсь к неправильному ключу? Есть ли другой способ сделать это?

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

08.03.2013

Ответы:


1

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

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

в то же время "Provider" сам по себе является массивом, поэтому вам придется сделать то же самое для него, например:

puts "#{h['System'][0]['Provider'][0]['Guid']"
08.03.2013
  • Благодарю вас! Я этого и не заметил! ставит #{h['System'][0]['Provider'][0]['Guid']} Дает мне значение GUID, которое я искал. 08.03.2013

  • 2

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

    08.03.2013

    3

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

    h['System'][0]['Provider']
    
    08.03.2013

    4

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

    h["System"].first["Provider"].first["Guid"]
    
    08.03.2013
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.