In MariaDB, EXTRACTVALUE()
is een ingebouwde tekenreeksfunctie die CDATA retourneert uit een XML-fragment.
De manier waarop het werkt, is dat het twee stringargumenten accepteert:een fragment van XML-opmaak en een XPath-expressie (d.w.z. een locator). EXTRACTVALUE()
retourneert vervolgens de CDATA (d.w.z. de tekst) van het eerste tekstknooppunt dat een kind is van het element of de elementen die overeenkomen met de XPath-expressie.
Syntaxis
De syntaxis gaat als volgt:
EXTRACTVALUE(xml_frag, xpath_expr)
Waar xml_frag
is het XML-fragment, en xpath_expr
is de XPath-expressie die overeenkomt.
Voorbeeld
Hier is een eenvoudig voorbeeld:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | Cat | +--------+
In dit geval is de XPath /type
, en dus retourneert het de CDATA (tekst) van het type
element.
Hier is er nog een:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | Homer | +--------+
In dit geval is de XPath /user
, en dus EXTRACTVALUE()
retourneert de CDATA van de user
element.
Merk op dat het de iq
. niet retourneerde element of de tekst ervan. Dat is te verwachten, want EXTRACTVALUE()
retourneert alleen de CDATA. Het retourneert geen onderliggende elementen of tekst die ze kunnen bevatten.
De text()-expressie gebruiken
Het is het equivalent van het verkrijgen van een overeenkomst door de expliciete text()
. toe te voegen uitdrukking:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | Cat | +--------+
Geneste elementen
Hier is een voorbeeld van het ophalen van CDATA uit een genest element:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | Low | +--------+
Hier hebben we de CDATA van de iq
element, dat is genest in de user
element. We hebben dit bereikt door /user/iq
. te gebruiken als de XPath.
Geen overeenkomst
Als zo'n element niet bestaat, wordt er niets geretourneerd.
Voorbeeld:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | | +--------+
Dit is ook het geval als je de nesting verkeerd doet.
Voorbeeld:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | | +--------+
Hier gebruikten we /iq
als de XPath terwijl we /user/iq
. hadden moeten gebruiken .
Lege XML
Een leeg XML-document zal een leeg resultaat opleveren:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Resultaat:
+--------+ | Result | +--------+ | | +--------+
Lege XPath
Een lege XPath retourneert een fout:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Resultaat:
ERROR 1105 (HY000): XPATH syntax error: ''
Null-XML
null
opgeven als het eerste argument resulteert in een fout:
SELECT EXTRACTVALUE(null, '');
Resultaat:
ERROR 1105 (HY000): XPATH syntax error: ''
Null XPath
null
opgeven als het tweede argument null
teruggeeft :
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Resultaat:
+--------+ | Result | +--------+ | NULL | +--------+
Slechts één argument geven
Het verstrekken van een enkel argument resulteert in een fout:
SELECT EXTRACTVALUE('<type>Cat</type>');
Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Ontbrekend argument
EXTRACTVALUE()
. aanroepen zonder het doorgeven van argumenten resulteert in een fout:
SELECT EXTRACTVALUE();
Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Inleiding tot XML
Zie mijn XML-zelfstudie op Quackit voor meer informatie over XML. Die tutorial bevat ook een inleiding tot XPath.