ruby - 从 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
您的代码不起作用的原因:
hosts
您正在尝试在块中合并两个具有相同键的哈希each
,而后者的 k/v 将覆盖前一个。
您需要的行为是将某些内容附加到数组中,因此只需关注它并忘记合并哈希。
推荐阅读
- ios - 更新后的错误:...异常'NSGenericException',原因:'此编码器要求从initWithCoder返回替换的对象:'
- vue.js - 将 vue-auth-image 插件集成到 Nuxt.js
- php - 从输入文件中使用 Codeigniter 中的 PHPExcel Api 读取 xlsx 文件时,如何修复错误(无法打开读取!文件不存在)?
- angular - Angular - 无法使用 .subsribe 将 json 数据存储在变量中
- sql - 仅当先前记录具有特定值时才显示记录
- javascript - Javascript 从 Math.random 中提取最后一个数字
- log4j2 - 如何控制 Karaf 的 log4j 2 PAX 缩减/截断多少行?
- c++ - 如何模拟一个采用已经定义的 lambda 函数并覆盖 lambda 函数的函数
- python - 30秒后实时解析日志文件
- java - 如何检查请求对象是否包含给定参数