Importer les données d'un fichier .xml

Bonjour,

Je souhaite importer les conversons de devises à partir de la BCE qui les diffuse quotidiennement en format xml.

https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

J'utilise la fonction IMPORTXML, mais autant sur un site HTML j'arrive à définir le XPath, autant sur des données structurées purement en xml je coince. Quelqu'un a-t-il la solution ? Précision = il s'agit de capter les attributs d'une balise, pas les nodeValue

En back-up, j'ai bien une solution

  • soit faire un parsing maison du xml sous sa forme de chaine
  • soit aller chercher les données sur le site de la banque de France en faisant
=importhtml("____url____";"table";1)

Bonjour,

Je ne connais rien aux XPath mais je t'ai fait une fonction qui te sort ça :

google sheets xml devises bce

La fonction XML :

function XML(url) {
  return UrlFetchApp.fetch(url).getContentText().match(/[A-Z]+' rate='[\d.]+/g).map(v => v.split(/' rate='/));
}

Cordialement,

C'est mieux que ma fonction ... car après avoir navigué pas mal je n'avais trouvé aucune solution à part cette direction que j'avais prise :

function devises() {
  var urlXml = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
  var xml = UrlFetchApp.fetch(urlXml).getContentText();
  xml=xml.replace(/'/g, "");
  xml=xml.replace(/\./g, ",");
  Logger.log(xml);
  var resultInTab = [];
  var currency, rate;
  var allCubes = xml.split('<Cube');
  for(var idx = 3; idx < allCubes.length; idx++) {
    var ligneTab = [];
    currency = allCubes[idx].split('currency=')[1].split(' ')[0];
    rate = allCubes[idx].split('rate=')[1].split('/>')[0];
    ligneTab.push(currency);
    ligneTab.push(rate);
    resultInTab.push(ligneTab);
  }
  // Logger.log(resultInTab);
  return resultInTab;
};

C'est même carrément excellentissime ! Wahou ...

Le pire, c'est que j'arrive même à comprendre la formule (sans savoir la pondre tout seul !). Dans les 2 cas on traite le texte en réalité. Pas mal joué du tout. Et je peux dire que c'est la meilleure réponse que j'ai jamais lue au cours de mon investigation documentaire du net.

Une solution :

=arrayformula(split(substitute(substitute(substitute(filter(arrayformula(importdata(A1));search("Cube currency";arrayformula(importdata(A1))));"<Cube ";"");"'/>";"");"' rate";"");"="))

sinon, LA solution avec IMPORTXML et XPath est la suivante (@ permet de récupérer la valeur des attributs, ouf !)

=importxml(A1;"//@time | //@rate | //@currency")

mais les valeurs sont superposées au lieu d'être côte à côte

2020-12-22
USD
1.2239
JPY
126.52

etc.

ou alors, dans 3 cellules côte à côte

=importxml(A1;"//@time")
=importxml(A1;"//@currency")
=importxml(A1;"//@rate")

In fine

en A1

=importxml("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml";"//@time | //@rate | //@currency")

en B1, un truc de malade que j'ai fini par adapter !

=ArrayFormula({"Devise"\"Taux";ARRAYFORMULA(VLOOKUP(SEQUENCE(ROUNDUP(COUNTA(A2:A)/2);2;ROW(A2));{ROW(A2:A)\A2:A};2;0))})

Edit,

je précise que, puisque les données sont au format 0.00 (le point est le séparateur des milliers), certains taux se transforment en date, et rien n'y fait, que ce soit en encadrant avec la formule TEXT ou en mettant l colonne au format texte, niet ! Le taux en USD qui est de 1.2166 est interprété comme le 1/1/2166 soit 97157 en valeur.

La seule solution est de mettre la feuille avec paramètres régionaux USA et mettre les formules en conséquence

=importxml("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml","//@time | //@rate | //@currency")

et ensuite

=ArrayFormula( {"Devise","Taux"; ARRAYFORMULA( (VLOOKUP(SEQUENCE(ROUNDUP(COUNTA(A2:A)/2),2,ROW(A2)),{ROW(A2:A),A2:A},2,0) ) ) } )
capture d ecran 331

Les autres solutions sont alors de traiter textuellement du fichier xml

  1. comme Sébastien ou moi-même l'avons fait avec un script.
  2. ou via la formule qui respecte l'aspect textuel des données.
=arrayformula(split(substitute(substitute(substitute(filter(arrayformula(importdata("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"));search("Cube currency";arrayformula(importdata("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"))));"<Cube ";"");"'/>";"");"' rate";"");"="))
Rechercher des sujets similaires à "importer donnees fichier xml"