从XML创建Ruby哈希



我有一个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网站上的相同:

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" => {}
}
ansible_hash['all']['hosts'] = []
xml_doc.xpath("//entry//hostname").each do |entry|
ansible_hash['all']['hosts'] << entry.inner_text
end

你的代码不工作的原因:

您试图在each块中合并具有相同密钥hosts的两个散列,后一个散列的k/v将覆盖前一个散列。

您需要的行为是将一些东西附加到数组中,所以只需关注它,而忽略合并哈希。

最新更新