En MariaDB, EXTRACTVALUE()
es una función de cadena incorporada que devuelve CDATA de un fragmento XML.
La forma en que funciona es que acepta dos argumentos de cadena:un fragmento de marcado XML y una expresión XPath (es decir, un localizador). EXTRACTVALUE()
luego devuelve el CDATA (es decir, el texto) del primer nodo de texto que es un elemento secundario del elemento o elementos que coinciden con la expresión XPath.
Sintaxis
La sintaxis es así:
EXTRACTVALUE(xml_frag, xpath_expr)
Donde xml_frag
es el fragmento XML y xpath_expr
es la expresión XPath para hacer coincidir.
Ejemplo
He aquí un ejemplo básico:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Cat | +--------+
En este caso, el XPath es /type
, por lo que devuelve el CDATA (texto) del type
elemento.
Aquí hay otro:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Homer | +--------+
En este caso, el XPath es /user
, y así EXTRACTVALUE()
devuelve el CDATA del user
elemento.
Observe que no devolvió el iq
elemento o su texto. Eso es de esperar, porque EXTRACTVALUE()
solo devuelve el CDATA. No devuelve ningún elemento secundario ni ningún texto que puedan contener.
Uso de la expresión text()
Es el equivalente a obtener una coincidencia agregando el text()
explícito expresión:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Cat | +--------+
Elementos anidados
Aquí hay un ejemplo de cómo obtener CDATA de un elemento anidado:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Low | +--------+
Aquí, obtuvimos el CDATA del iq
elemento, que está anidado dentro del user
elemento. Logramos esto usando /user/iq
como XPath.
Sin coincidencia
Si no existe tal elemento, no se devuelve nada.
Ejemplo:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
Este también es el caso si se equivoca en el anidamiento.
Ejemplo:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
Aquí, usamos /iq
como XPath cuando deberíamos haber usado /user/iq
.
XML vacío
Un documento XML vacío producirá un resultado vacío:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
XPath vacío
Un XPath vacío devuelve un error:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Resultado:
ERROR 1105 (HY000): XPATH syntax error: ''
XML nulo
Proporcionar null
como el primer argumento da como resultado un error:
SELECT EXTRACTVALUE(null, '');
Resultado:
ERROR 1105 (HY000): XPATH syntax error: ''
XPath nulo
Proporcionar null
como el segundo argumento devuelve null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Resultado:
+--------+ | Result | +--------+ | NULL | +--------+
Proveer un solo argumento
Proporcionar un solo argumento da como resultado un error:
SELECT EXTRACTVALUE('<type>Cat</type>');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Argumento faltante
Llamando a EXTRACTVALUE()
sin pasar ningún argumento da como resultado un error:
SELECT EXTRACTVALUE();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introducción a XML
Para obtener más información sobre XML, consulte mi Tutorial de XML en Quackit. Ese tutorial también incluye una Introducción a XPath.