Dans MariaDB, EXTRACTVALUE()
est une fonction de chaîne intégrée qui renvoie CDATA à partir d'un fragment XML.
La façon dont cela fonctionne est qu'il accepte deux arguments de chaîne :un fragment de balisage XML et une expression XPath (c'est-à-dire un localisateur). EXTRACTVALUE()
puis renvoie le CDATA (c'est-à-dire le texte) du premier nœud de texte qui est un enfant de l'élément ou des éléments correspondant à l'expression XPath.
Syntaxe
La syntaxe ressemble à ceci :
EXTRACTVALUE(xml_frag, xpath_expr)
Où xml_frag
est le fragment XML, et xpath_expr
est l'expression XPath à faire correspondre.
Exemple
Voici un exemple de base :
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Résultat :
+--------+ | Result | +--------+ | Cat | +--------+
Dans ce cas, le XPath est /type
, et donc il renvoie le CDATA (texte) du type
élément.
En voici une autre :
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Résultat :
+--------+ | Result | +--------+ | Homer | +--------+
Dans ce cas, le XPath est /user
, et donc EXTRACTVALUE()
renvoie le CDATA de l'user
élément.
Notez qu'il n'a pas renvoyé le iq
élément ou son texte. C'est normal, car EXTRACTVALUE()
ne renvoie que le CDATA. Il ne renvoie aucun élément enfant ni aucun texte qu'ils peuvent contenir.
Utiliser l'expression text()
C'est l'équivalent d'obtenir une correspondance en ajoutant le text()
explicite expression :
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Résultat :
+--------+ | Result | +--------+ | Cat | +--------+
Éléments imbriqués
Voici un exemple d'obtention de CDATA à partir d'un élément imbriqué :
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Résultat :
+--------+ | Result | +--------+ | Low | +--------+
Ici, nous avons obtenu le CDATA du iq
élément, qui est imbriqué dans l'élément user
élément. Nous y sommes parvenus en utilisant /user/iq
comme XPath.
Aucune correspondance
Si aucun élément de ce type n'existe, rien n'est renvoyé.
Exemple :
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Résultat :
+--------+ | Result | +--------+ | | +--------+
C'est également le cas si vous vous trompez d'imbrication.
Exemple :
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Résultat :
+--------+ | Result | +--------+ | | +--------+
Ici, nous avons utilisé /iq
comme XPath alors que nous aurions dû utiliser /user/iq
.
XML vide
Un document XML vide produira un résultat vide :
SELECT EXTRACTVALUE('', '/name') AS "Result";
Résultat :
+--------+ | Result | +--------+ | | +--------+
XPath vide
Un XPath vide renvoie une erreur :
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Résultat :
ERROR 1105 (HY000): XPATH syntax error: ''
XML nul
Fournir null
car le premier argument génère une erreur :
SELECT EXTRACTVALUE(null, '');
Résultat :
ERROR 1105 (HY000): XPATH syntax error: ''
XPath nul
Fournir null
car le deuxième argument renvoie null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Résultat :
+--------+ | Result | +--------+ | NULL | +--------+
Fournir un seul argument
La fourniture d'un seul argument génère une erreur :
SELECT EXTRACTVALUE('<type>Cat</type>');
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Argument manquant
Appel de EXTRACTVALUE()
sans passer d'arguments entraîne une erreur :
SELECT EXTRACTVALUE();
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introduction à XML
Pour en savoir plus sur XML, consultez mon didacticiel XML sur Quackit. Ce didacticiel comprend également une introduction à XPath.