EXTRACTVALUE
Sintassi
ExtractValue(xml_frag, xpath_espr)
Spiegazione
ExtractValue()
accetta due frammenti stringa: un frammento XML xml_frag
e un'expressione XPath xpath_espr
(chiamato anche localizzatore); restituisce il testo (CDATA
) del primo nodo di testo che è figlio dell'elemento (o degli elementi) che corrispondono all'espressione XPath. Equivale a cercare una corrispondenza utilizzando xpath_espr
dopo aver aggiunto /text()
. In altre parole,
ExtractValue('<a><b>Sakila</b></a>', '/a/b')
e
ExtractValue('<a><b>Sakila</b></a>', '/a/b/text()')
producono lo stesso risultato.
Se vengono trovate più corrispondenze, viene restituito il contenuto del primo nodo figlio testuale di ogni elemento (nell'ordine in cui vengono trovati) in stringhe delimitate da spazi.
Se non viene trovato alcun nodo di testo che corrisponda all'espressione (compreso il /text() implicito) —, e xpath_espr
è valida, e xml_frag
consiste di elementi annidati e chiusi in modo corretto — viene restituita una stringa vuota. Non viene fatta distinzione tra una corrispondenza su un elemento vuoto e nessuna corrispondenza. Questa è una scelta di progetto.
Se si necessita di determinare se nessun elemento è stato trovato in xml_frag
o se tale elemento è stato trovato ma non contiene alcun nodo di testo, si può testare il risultato di un'espressione che utilizza la funzione XPath count()
. Per esempio, entrambe queste funzioni restituiscono una stringa vuota:
MariaDB [(none)]> SELECT ExtractValue('<a><b/></a>', '/a/b'); +-------------------------------------+ | ExtractValue('<a><b/></a>', '/a/b') | +-------------------------------------+ | | +-------------------------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> SELECT ExtractValue('<a><c/></a>', '/a/b'); +-------------------------------------+ | ExtractValue('<a><c/></a>', '/a/b') | +-------------------------------------+ | | +-------------------------------------+ 1 row in set (0.00 sec)
E' però possibile determinare se una corrispondenza sia stata trovata, nel modo seguente:
MariaDB [(none)]> SELECT ExtractValue('<a><b/></a>', 'count(/a/b)'); +--------------------------------------------+ | ExtractValue('<a><b/></a>', 'count(/a/b)') | +--------------------------------------------+ | 1 | +--------------------------------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> SELECT ExtractValue('<a><c/></a>', 'count(/a/b)'); +--------------------------------------------+ | ExtractValue('<a><c/></a>', 'count(/a/b)') | +--------------------------------------------+ | 0 | +--------------------------------------------+ 1 row in set (0.00 sec)
Importante: ExtractValue()
restituisce solo CDATA
, e non restituisce mai tag che siano contenuti in un tag trovato come corrispondenza, nè il suo contenuto (si veda il risultato restituito come val1
nel seguente esempio).
Esempi
MariaDB [(none)]> SELECT -> ExtractValue('<a>ccc<b>ddd</b></a>', '/a') AS val1, -> ExtractValue('<a>ccc<b>ddd</b></a>', '/a/b') AS val2, -> ExtractValue('<a>ccc<b>ddd</b></a>', '//b') AS val3, -> ExtractValue('<a>ccc<b>ddd</b></a>', '/b') AS val4, -> ExtractValue('<a>ccc<b>ddd</b><b>eee</b></a>', '//b') AS val5; +------+------+------+------+---------+ | val1 | val2 | val3 | val4 | val5 | +------+------+------+------+---------+ | ccc | ddd | ddd | | ddd eee | +------+------+------+------+---------+ 1 row in set (0.00 sec)