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.