Rôle
La fonction FILTRE.XML permet d'extraire des données spécifiques d'une chaîne XML en renvoyant une matrice de résultats.
Il y a quelques exemples dans l'article Exploiter des données d'Internet avec la fonction SERVICEWEB 1.
Pour des informations sur le XML
Syntaxe
= FILTRE.XML( Xml ; XPath )
- Xml : Chaîne au format XML.
- XPath : Chaîne au format XPath standard (langage de requête).
Utilisation pour faire fractionner une chaîne
L'astuce est de maquiller la chaîne de texte en chaîne XML puis d'utiliser le bon XPath pour extraire la partie ciblée.
Exemple 1 : Toutes les occurrences
Fractionner la chaîne de la cellule B2 ("a/bbb/cccc/dd") au niveau des /.
=FILTRE.XML( "<root><node>" & SUBSTITUE(B2 ; "/" ; "</node><node>") & "</node></root>" ; "//node" )
- On ajoute le préfixe <root><node> (ou <r><n> si on veut) qui ouvre la chaîne XML (racine) et ouvre le 1er nœud.
- On remplace le séparateur par </node><node> fermant et ouvrant un nœud.
- On termine la chaîne par </node></root> en fermant le dernier nœud et en fermant la chaîne XML.
On obtient pour l'argument Xml la chaîne suivante :
<root><node>a</node><node>bbb</node><node>cccc</node><node>dd</node></root>
On indique dans XPath que l'on veut extraire tous les nœuds <node> : //node
Alternative
Il existe maintenant la fonction FRACTIONNER.TEXTE pour obtenir ce résultat.
= FRACTIONNER.TEXTE( B2 ; ; "/" )
Exemple 2 : Une occurrence en se basant sur sa position
On cherche la 3eme valeur (=>cccc).
= INDEX(FILTRE.XML("<root><node>" & SUBSTITUE(B2;"/";"</node><node>") & "</node></root>";"//node");3)
Alternative
= INDEX(FRACTIONNER.TEXTE(B2;"/");3)
Exemple 3 : Une occurrence en se basant sur son prédécesseur
La chaîne en B2 est "Lundi/1/Mardi/10/Mercredi/100".
On cherche la valeur de Mardi (celle qui suit Mardi =>10).
=FILTRE.XML("<root><node>" & SUBSTITUE(B2;"/";"</node><node>") &
"</node></root>";"/root/node[text()='Mardi']/following-sibling::node[1]")
Alternative
=LET(Tab;FRACTIONNER.TEXTE(E14;"/");
INDEX(Tab ; EQUIV("Mardi";Tab;0) + 1)) * 1
LET => On définit un nom Tab contenant la matrice des valeurs.
EQUIV => On récupère la position de Mardi dans Tab.
INDEX => On prend la valeur suivante (EQUIV()+1).
Le *1 est pour convertir la valeur en numérique.
Exemple 4 : La valeur d'un attribut
La chaîne en B2 est "<value code="OTAN" label="Organisation du traité de l'Atlantique Nord" labelEN="NATO" rank="9684"/>"
On cherche les valeurs des attributs label (=>Organisation du traité...) et rank (=>9684).
=FILTRE.XML(B2 ; "/value/@label")
=FILTRE.XML(B2 ; "/value/@rank")
Alternative
=INDEX(FRACTIONNER.TEXTE(B2;"""");4)
=INDEX(FRACTIONNER.TEXTE(B2;"""");8)
Merci pour votre attention bienveillante.