I MariaDB, EXTRACTVALUE()
är en inbyggd strängfunktion som returnerar CDATA från ett XML-fragment.
Sättet det fungerar på är att det accepterar två strängargument:ett fragment av XML-uppmärkning och ett XPath-uttryck (d.v.s. en locator). EXTRACTVALUE()
returnerar sedan CDATA (dvs. texten) för den första textnoden som är ett underordnat element till elementet eller elementen som matchar XPath-uttrycket.
Syntax
Syntaxen ser ut så här:
EXTRACTVALUE(xml_frag, xpath_expr)
Där xml_frag
är XML-fragmentet och xpath_expr
är XPath-uttrycket som ska matchas.
Exempel
Här är ett grundläggande exempel:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Cat | +--------+
I det här fallet är XPath /type
, och så returnerar den CDATA (text) från type
element.
Här är en till:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Homer | +--------+
I det här fallet är XPath /user
, och så EXTRACTVALUE()
returnerar CDATA från user
element.
Observera att den inte returnerade iq
element eller dess text. Det är att vänta, eftersom EXTRACTVALUE()
returnerar endast CDATA. Det returnerar inte några underordnade element eller någon text som de kan innehålla.
Använda text()-uttrycket
Det motsvarar att få en matchning genom att lägga till den explicita text()
uttryck:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Cat | +--------+
Inkapslade element
Här är ett exempel på hur du hämtar CDATA från ett kapslat element:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Low | +--------+
Här fick vi CDATA från iq
element, som är kapslat inuti user
element. Vi uppnådde detta genom att använda /user/iq
som XPath.
Ingen match
Om inget sådant element finns returneras inget.
Exempel:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Detta är också fallet om du gör fel.
Exempel:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Här använde vi /iq
som XPath när vi borde ha använt /user/iq
.
Töm XML
Ett tomt XML-dokument ger ett tomt resultat:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Töm XPath
En tom XPath returnerar ett fel:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Resultat:
ERROR 1105 (HY000): XPATH syntax error: ''
Null XML
Tillhandahåller null
som det första argumentet resulterar i ett fel:
SELECT EXTRACTVALUE(null, '');
Resultat:
ERROR 1105 (HY000): XPATH syntax error: ''
Null XPath
Tillhandahåller null
eftersom det andra argumentet returnerar null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Resultat:
+--------+ | Result | +--------+ | NULL | +--------+
Ge bara ett argument
Att tillhandahålla ett enda argument resulterar i ett fel:
SELECT EXTRACTVALUE('<type>Cat</type>');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Argument saknas
Anropar EXTRACTVALUE()
utan att skicka några argument resulterar i ett fel:
SELECT EXTRACTVALUE();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introduktion till XML
För mer om XML, se min XML-handledning på Quackit. Den självstudien innehåller också en introduktion till XPath.