In MariaDB, EXTRACTVALUE()
è una funzione di stringa incorporata che restituisce CDATA da un frammento XML.
Il modo in cui funziona è che accetta due argomenti stringa:un frammento di markup XML e un'espressione XPath (cioè un localizzatore). EXTRACTVALUE()
quindi restituisce il CDATA (cioè il testo) del primo nodo di testo che è figlio dell'elemento o degli elementi corrispondenti all'espressione XPath.
Sintassi
La sintassi è questa:
EXTRACTVALUE(xml_frag, xpath_expr)
Dove xml_frag
è il frammento XML e xpath_expr
è l'espressione XPath da abbinare.
Esempio
Ecco un esempio di base:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Risultato:
+--------+ | Result | +--------+ | Cat | +--------+
In questo caso, l'XPath è /type
, e quindi restituisce il CDATA (testo) dal type
elemento.
Eccone un altro:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Risultato:
+--------+ | Result | +--------+ | Homer | +--------+
In questo caso, l'XPath è /user
, e così EXTRACTVALUE()
restituisce il CDATA dall'user
elemento.
Nota che non ha restituito iq
elemento o il suo testo. C'è da aspettarselo, perché EXTRACTVALUE()
restituisce solo il CDATA. Non restituisce alcun elemento figlio o testo che potrebbero contenere.
Utilizzo dell'espressione text()
È l'equivalente di ottenere una corrispondenza aggiungendo l'esplicito text()
espressione:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Risultato:
+--------+ | Result | +--------+ | Cat | +--------+
Elementi nidificati
Ecco un esempio di come ottenere CDATA da un elemento nidificato:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Risultato:
+--------+ | Result | +--------+ | Low | +--------+
Qui, abbiamo ottenuto il CDATA da iq
elemento, che è nidificato all'interno di user
elemento. Abbiamo ottenuto questo risultato utilizzando /user/iq
come XPath.
Nessuna corrispondenza
Se non esiste alcun elemento di questo tipo, non viene restituito nulla.
Esempio:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Risultato:
+--------+ | Result | +--------+ | | +--------+
Questo è anche il caso se sbagli l'annidamento.
Esempio:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Risultato:
+--------+ | Result | +--------+ | | +--------+
Qui abbiamo usato /iq
come XPath quando avremmo dovuto usare /user/iq
.
XML vuoto
Un documento XML vuoto produrrà un risultato vuoto:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Risultato:
+--------+ | Result | +--------+ | | +--------+
XPath vuoto
Un XPath vuoto restituisce un errore:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Risultato:
ERROR 1105 (HY000): XPATH syntax error: ''
XML nullo
Fornendo null
poiché il primo argomento genera un errore:
SELECT EXTRACTVALUE(null, '');
Risultato:
ERROR 1105 (HY000): XPATH syntax error: ''
Percorso XP nullo
Fornendo null
poiché il secondo argomento restituisce null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Risultato:
+--------+ | Result | +--------+ | NULL | +--------+
Fornire un solo argomento
Fornire un singolo argomento genera un errore:
SELECT EXTRACTVALUE('<type>Cat</type>');
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Argomento mancante
Chiamando EXTRACTVALUE()
senza passare alcun argomento genera un errore:
SELECT EXTRACTVALUE();
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Introduzione a XML
Per ulteriori informazioni su XML, vedere il mio tutorial XML su Quackit. Quel tutorial include anche un'introduzione a XPath.