No MariaDB,
EXTRACTVALUE()
é uma função de string interna que retorna CDATA de um fragmento XML. A maneira como funciona é que ele aceita dois argumentos de string:um fragmento de marcação XML e uma expressão XPath (ou seja, um localizador).
EXTRACTVALUE()
em seguida, retorna o CDATA (ou seja, o texto) do primeiro nó de texto que é filho do elemento ou elementos correspondentes à expressão XPath. Sintaxe
A sintaxe fica assim:
EXTRACTVALUE(xml_frag, xpath_expr)
Onde
xml_frag
é o fragmento XML e xpath_expr
é a expressão XPath para corresponder. Exemplo
Segue um exemplo básico:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Cat | +--------+
Neste caso, o XPath é
/type
, e assim retorna o CDATA (texto) do type
elemento. Aqui está mais um:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Homer | +--------+
Neste caso, o XPath é
/user
, e assim EXTRACTVALUE()
retorna o CDATA do user
elemento. Observe que ele não retornou o
iq
elemento ou seu texto. Isso é esperado, porque EXTRACTVALUE()
apenas retorna o CDATA. Ele não retorna nenhum elemento filho ou qualquer texto que eles possam conter. Usando a expressão text()
É o equivalente a obter uma correspondência anexando o
text()
explícito expressão:SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Cat | +--------+
Elementos aninhados
Aqui está um exemplo de como obter CDATA de um elemento aninhado:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Resultado:
+--------+ | Result | +--------+ | Low | +--------+
Aqui, pegamos o CDATA do
iq
elemento, que está aninhado dentro do user
elemento. Conseguimos isso usando /user/iq
como o XPath. Sem correspondência
Se não existir tal elemento, nada será retornado.
Exemplo:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
Este também é o caso se você errar o aninhamento.
Exemplo:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
Aqui, usamos
/iq
como o XPath quando deveríamos ter usado /user/iq
. XML vazio
Um documento XML vazio produzirá um resultado vazio:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Resultado:
+--------+ | Result | +--------+ | | +--------+
XPath vazio
Um XPath vazio retorna um erro:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Resultado:
ERROR 1105 (HY000): XPATH syntax error: ''
XML nulo
Fornecendo
null
como o primeiro argumento resulta em um erro:SELECT EXTRACTVALUE(null, '');
Resultado:
ERROR 1105 (HY000): XPATH syntax error: ''
XPath Nulo
Fornecendo
null
como o segundo argumento retorna null
:SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Resultado:
+--------+ | Result | +--------+ | NULL | +--------+
Fornecendo apenas um argumento
Fornecer um único argumento resulta em um erro:
SELECT EXTRACTVALUE('<type>Cat</type>');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Argumento ausente
Chamando
EXTRACTVALUE()
sem passar nenhum argumento resulta em um erro:SELECT EXTRACTVALUE();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introdução ao XML
Para saber mais sobre XML, veja meu Tutorial de XML no Quackit. Esse tutorial também inclui uma introdução ao XPath.