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)

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.