I MariaDB, EXTRACTVALUE()
er en indbygget strengfunktion, der returnerer CDATA fra et XML-fragment.
Den måde, det fungerer på, er, at det accepterer to strengargumenter:et fragment af XML-markering og et XPath-udtryk (dvs. en locator). EXTRACTVALUE()
returnerer derefter CDATA (dvs. teksten) for den første tekstknude, som er et underordnet element af det eller de elementer, der matcher XPath-udtrykket.
Syntaks
Syntaksen ser sådan ud:
EXTRACTVALUE(xml_frag, xpath_expr)
Hvor xml_frag
er XML-fragmentet og xpath_expr
er det XPath-udtryk, der skal matche.
Eksempel
Her er et grundlæggende eksempel:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Cat | +--------+
I dette tilfælde er XPath'en /type
, og så returnerer den CDATA (tekst) fra type
element.
Her er endnu en:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Homer | +--------+
I dette tilfælde er XPath /user
, og så EXTRACTVALUE()
returnerer CDATA'en fra user
element.
Bemærk, at det ikke returnerede iq
element eller dets tekst. Det kan forventes, fordi EXTRACTVALUE()
returnerer kun CDATA. Det returnerer ikke underordnede elementer eller nogen tekst, som de måtte indeholde.
Brug af tekst()-udtrykket
Det svarer til at få et match ved at tilføje den eksplicitte text()
udtryk:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Cat | +--------+
Indlejrede elementer
Her er et eksempel på at få CDATA fra et indlejret element:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Resultat:
+--------+ | Result | +--------+ | Low | +--------+
Her fik vi CDATA fra iq
element, som er indlejret i user
element. Vi opnåede dette ved at bruge /user/iq
som XPath.
Ingen match
Hvis der ikke findes et sådant element, returneres intet.
Eksempel:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Dette er også tilfældet, hvis du tager redet forkert.
Eksempel:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Her brugte vi /iq
som XPath, når vi skulle have brugt /user/iq
.
Tøm XML
Et tomt XML-dokument vil producere et tomt resultat:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Resultat:
+--------+ | Result | +--------+ | | +--------+
Tøm XPath
En tom XPath returnerer en fejl:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Resultat:
ERROR 1105 (HY000): XPATH syntax error: ''
Nul XML
Giver null
som det første argument resulterer i en fejl:
SELECT EXTRACTVALUE(null, '');
Resultat:
ERROR 1105 (HY000): XPATH syntax error: ''
Nul XPath
Giver null
da det andet argument returnerer null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Resultat:
+--------+ | Result | +--------+ | NULL | +--------+
Giver kun ét argument
Angivelse af et enkelt argument resulterer i en fejl:
SELECT EXTRACTVALUE('<type>Cat</type>');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Manglende argument
Kalder EXTRACTVALUE()
uden at sende nogen argumenter resulterer det i en fejl:
SELECT EXTRACTVALUE();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introduktion til XML
For mere om XML, se min XML-tutorial på Quackit. Denne vejledning indeholder også en introduktion til XPath.