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.