我有一个项目,它需要大量的 XML 数据并将其传递给 Nokogiri,最终将每个元素添加到输出到 YAML 文件的哈希中。
这在 XML 数据集包含重复键之前有效。
示例数据:
<document>
<form xmlns="">
<title>
<main-title>Foo</main-title>
</title>
<homes>
<home>
<home-name>home 1</home-name>
<home-price>10</home-price>
</home>
<home>
<home-name>home 2</home-name>
<home-price>20</home-price>
</home>
</homes>
</form>
</document>
在homes
元素中我可以有多个家,但是每个家home
总是包含不同的内容。
该数据最终应输出如下结构:
title:
main-title: Foo
homes:
home:
home-name: home 1
home-price: 10
home:
home-name: home 2
home-price: 20
但是我得到的只是里面的最后一个元素homes
title:
main-title: Foo
homes:
home:
home-name: home 2
home-price: 20
我相信这是因为,在将每个元素添加到散列时,如果它已经存在,它将简单地覆盖键,因此总是给我最后一个键。
这是用于将元素附加到哈希的代码:
def map_content(nodes, content_hash)
nodes.map do |element|
case element
when Nokogiri::XML::Element
child_content = map_content(element.children, {})
content_hash[element.name] = child_content unless child_content.empty?
when Nokogiri::XML::Text
return element.content
end
end
content_hash
end
我相信
content_hash[element.name] = child_content
是罪魁祸首,但是这段代码创建了具有这些类型的重复键的类似 YAML 文件,我想保留该功能,所以我不想简单地向数据哈希添加唯一键,因为这意味着我需要修改许多方法并更新它们从 YAML 文件中提取数据的方式。
我读过compare_by_identity
但不确定我将如何实现这一点。
我尝试使用compare_by_identity
,但它只会导致一个空的 YAML 文件,所以也许它正在生成哈希但它不能写入 YAML 文件?
def map_content(nodes, content_hash)
content_hash = content_hash.compare_by_identity
nodes.map do |element|
case element
when Nokogiri::XML::Element
child_content = map_content(element.children, {})
content_hash[element.name] = child_content unless child_content.empty?
when Nokogiri::XML::Text
return element.content
end
end
content_hash
end
end