V MariaDB EXTRACTVALUE()
je vestavěná řetězcová funkce, která vrací CDATA z fragmentu XML.
Funguje to tak, že přijímá dva řetězcové argumenty:fragment značky XML a výraz XPath (tj. lokátor). EXTRACTVALUE()
pak vrátí CDATA (tj. text) prvního textového uzlu, který je potomkem prvku nebo prvků odpovídajících výrazu XPath.
Syntaxe
Syntaxe vypadá takto:
EXTRACTVALUE(xml_frag, xpath_expr)
Kde xml_frag
je fragment XML a xpath_expr
je odpovídající výraz XPath.
Příklad
Zde je základní příklad:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | Cat | +--------+
V tomto případě je XPath /type
, a tak vrací CDATA (text) z type
prvek.
Tady je další:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | Homer | +--------+
V tomto případě je XPath /user
a tak EXTRACTVALUE()
vrátí CDATA od user
prvek.
Všimněte si, že nevrátil iq
prvek nebo jeho text. To se dalo očekávat, protože EXTRACTVALUE()
vrátí pouze CDATA. Nevrací žádné podřízené prvky ani žádný text, který mohou obsahovat.
Použití výrazu text()
Je to ekvivalent získání shody připojením explicitního text()
výraz:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | Cat | +--------+
Vnořené prvky
Zde je příklad získání CDATA z vnořeného prvku:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | Low | +--------+
Zde jsme získali CDATA z iq
prvek, který je vnořen do user
živel. Dosáhli jsme toho pomocí /user/iq
jako XPath.
Žádná shoda
Pokud žádný takový prvek neexistuje, nic se nevrací.
Příklad:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | | +--------+
To platí také v případě, že vnoření uděláte špatně.
Příklad:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | | +--------+
Zde jsme použili /iq
jako XPath, když jsme měli použít /user/iq
.
Vyprázdnit soubor XML
Prázdný dokument XML vytvoří prázdný výsledek:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Výsledek:
+--------+ | Result | +--------+ | | +--------+
Vyprázdněte cestu XPath
Prázdná cesta XPath vrátí chybu:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Výsledek:
ERROR 1105 (HY000): XPATH syntax error: ''
Nulové XML
Poskytování null
jako první argument vede k chybě:
SELECT EXTRACTVALUE(null, '');
Výsledek:
ERROR 1105 (HY000): XPATH syntax error: ''
Nová cesta XPath
Poskytování null
jako druhý argument vrátí null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Výsledek:
+--------+ | Result | +--------+ | NULL | +--------+
Poskytování pouze jednoho argumentu
Poskytnutí jediného argumentu má za následek chybu:
SELECT EXTRACTVALUE('<type>Cat</type>');
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Chybí argument
Volání EXTRACTVALUE()
bez předání jakýchkoli argumentů dojde k chybě:
SELECT EXTRACTVALUE();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Úvod do XML
Více o XML najdete v mém XML Tutorial na Quackit. Tento tutoriál také obsahuje Úvod do XPath.