Создание Ruby Hash из XML - PullRequest
       1

Создание Ruby Hash из XML

0 голосов
/ 30 ноября 2018

У меня есть XML-документ, который выглядит следующим образом (и содержит сотни таких записей):

<entry name="entryname">
  <serial>1234567</serial>
  <hostname>host1</hostname>
  <ip-address>100.200.300.400</ip-address>
  <mac-address>00-00-00-00</mac-address>
</entry>

ansible_hash - это хэш, который я буду использовать в качестве основы для динамического доступа к отчетам, иимеет структуру, как на веб-сайте Ansible:

ansible_hash = {
  "_meta" => {"hostvars" => {}},
  "all" => {
    "children" => ["ungrouped"]
  },
  "ungrouped" => {}
}

Я пытаюсь использовать Nokogiri для получения имени хоста из документа XML и добавления его в ansible_hash.Я хотел бы, чтобы каждое из имен хостов добавлялось в массив под ключом "hosts".Как я могу этого достичь?

Когда я это делаю,

xml_doc = Nokogiri::XML(File.open("file.xml", "r"))
xml_doc.xpath("//entry//hostname").each do |entry|
  ansible_hash["all"] = ansible_hash["all"].merge("hosts" => ["#{entry.inner_text}"])
end

запись под "all" => {"hosts" => []} имеет только последний, подобный этому:

{
  "_meta" => {"hostvars"=>{}},
  "all" => {
    "children" => ["ungrouped"],
    "hosts" => ["host200"]
  },
  "ungrouped" => {}
}

1 Ответ

0 голосов
/ 30 ноября 2018
ansible_hash['all']['hosts'] = []
xml_doc.xpath("//entry//hostname").each do |entry|
  ansible_hash['all']['hosts'] << entry.inner_text
end

Причина, по которой ваш код не работает:

Вы пытаетесь объединить два хэша с одним и тем же ключом hosts в блоке each, и k / v последнего перезапишетпредыдущий.

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

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