J'ai un projet qui prend de grandes quantités de données XML et les transmet à Nokogiri, ajoutant finalement chaque élément à un hachage sortant dans un fichier YAML.Comment ajouter des clés dupliquées de XML à un hachage
Cela fonctionne jusqu'à ce que l'ensemble de données XML contienne des clés en double.
Exemple de données:
<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>
Dans l'élément homes
je peux avoir plusieurs maisons, mais chaque home
contiendra toujours un contenu différent.
Ces données devraient une structure comme celui-ci a finalement sortie:
title:
main-title: Foo
homes:
home:
home-name: home 1
home-price: 10
home:
home-name: home 2
home-price: 20
Cependant tout ce que je reçois est le dernier élément à l'intérieur homes
title:
main-title: Foo
homes:
home:
home-name: home 2
home-price: 20
Je crois que ce soit parce que, lors de l'ajout de chaque élément au hachage, il écrase simplement la clé si elle existe déjà, me donnant toujours la dernière clé.
C'est le code utilisé pour ajouter des éléments au hachage:
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
Je crois
content_hash[element.name] = child_content
est le coupable, mais ce code crée des fichiers YAML similaires qui ont ces types de clés en double , et je voudrais préserver cette fonctionnalité, donc je ne veux pas simplement ajouter une clé unique au hachage de données car cela signifierait que je devrais modifier de nombreuses méthodes et mettre à jour comment ils tirent des données du fichier YAML.
Je lis environ compare_by_identity
mais je ne sais pas si je mettrais cela en œuvre.
J'ai essayé d'utiliser compare_by_identity
mais seulement des résultats dans un fichier YAML vide, alors peut-être il est de générer le hachage mais il ne peut pas écrire dans le fichier 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
Qu'en est-il d'avoir une clé et tout mettre 'maisons' au-dessous dans un tableau? La structure que vous proposez ne fonctionnera pas, car elle vous donnera le même résultat (avec seulement la dernière: clé d'accueil) lors du chargement dans votre application. – Severin
Hmm J'essaie de ne pas modifier la structure actuelle, mais c'est peut-être le seul moyen. – chinds
La sortie YAML souhaitée n'est pas possible. Le YAML, une fois analysé, se traduira par un hachage avec des clés en double, que vous avez déjà découvert n'est pas possible. Vous devez utiliser un tableau de hachages. –