Je tente d'analyser XML dans le format suivant (de la Banque centrale européenne flux de données) en utilisant libxml-ruby:Parsing XML en utilisant libxml un espace de noms-ruby
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2009-11-03">
<Cube currency="USD" rate="1.4658"/>
<Cube currency="JPY" rate="132.25"/>
<Cube currency="BGN" rate="1.9558"/>
</Cube>
</Cube>
</gesmes:Envelope>
Je chargement du document comme suit :
require 'rubygems'
require 'xml/libxml'
doc = XML::Document.file('eurofxref-hist.xml')
Mais je me bats pour arriver à la configuration de l'espace de noms correct pour permettre des requêtes XPath sur les données.
Je peux extraire tous les Cube
noeuds en utilisant le code suivant:
doc.find("//*[local-name()='Cube']")
Mais étant donné que les deux le nœud parent et les nœuds enfants sont tous deux appelés Cube
cela ne m'a vraiment aide pas itérer sur seulement les nœuds parents . Peut-être que je pourrais modifier ce XPATH pour trouver seulement ces nœuds avec un paramètre time
?
Mon but est d'être en mesure d'extraire tous les Cube
noeuds qui ont un attribut time
(à savoir <Cube time="2009-11-03">
) donc je peut alors extraire la date et itérer sur les taux de change chez l'enfant Cube
nœuds.
Quelqu'un peut-il aider?
Aucune de ces œuvres en fait, ils retournent pas de nœuds. J'ai essayé le premier moi-même initialement sans succès. Fait intéressant, si je supprime tous les espaces de noms et que j'utilise une balise racine de 'test' alors '/ test/Cube/Cube' fonctionne bien comme prévu. Des idées? – Olly
Voir ci-dessus pour le code de travail. A pris une bonne quantité d'essais et d'erreurs pour obtenir – Zack
Aha! Merci pour cela. J'ai en fait trouvé une solution que je viens de poster, mais votre solution me sauve un lien de code :) – Olly