Spec-Zone.ru › MariaDB

EXTRACTVALUE

Синтаксис

EXTRACTVALUE(xml_frag, xpath_expr)

Описание

Функция EXTRACTVALUE() принимает два строковых аргумента: фрагмент XML-разметки и выражение XPath (также известное как локатор). Она возвращает текст (то есть CDDATA) первого текстового узла, являющегося потомком элемента или элементов, соответствующих выражению XPath.

В случаях, когда действительное выражение XPath не соответствует никаким текстовым узлам в корректном XML-фрагменте (включая неявное выражение /text()), функция EXTRACTVALUE() возвращает пустую строку.

Некорректные аргументы

Когда либо XML-фрагмент, либо выражение XPath является NULL, функция EXTRACTVALUE() возвращает NULL. Если XML-фрагмент некорректен, генерируется предупреждение с кодом 1525:

Warning (Code 1525): Incorrect XML value: 'parse error at line 1 pos 11: unexpected END-OF-INPUT'

Если значение XPath некорректно, генерируется ошибка 1105:

ERROR 1105 (HY000): XPATH syntax error: ')'

Явные выражения text()

Эта функция эквивалентна выполнению совпадения с помощью выражения XPath после добавления /text(). Другими словами:

SELECT
   EXTRACTVALUE('<cases><case>example</case></cases>', '/cases/case') 
    AS 'Base Example',
   EXTRACTVALUE('<cases><case>example</case></cases>', '/cases/case/text()') 
    AS 'text() Example';
+--------------+----------------+
| Base Example | text() Example |
+--------------+----------------+
| example      | example        |
+--------------+----------------+

Подсчёт совпадений

Когда функция EXTRACTVALUE() возвращает несколько совпадений, она возвращает содержимое первого текстового узла-потомка каждого соответствующего элемента в порядке совпадения в виде одной строки, разделённой пробелами.

По умолчанию, функция EXTRACTVALUE() не различает совпадение с пустым элементом и полное отсутствие совпадений. Если необходимо определить, не было ли найдено ни одного соответствующего элемента в XML-фрагменте или был найден элемент, не содержащий текстовых узлов-потомков, используйте функцию XPath count().

Например, при поиске значения, которое существует, но не содержит текстовых узлов-потомков, вы получите количество соответствующих экземпляров:

SELECT
   EXTRACTVALUE('<cases><case/></cases>', '/cases/case') 
    AS 'Empty Example',
   EXTRACTVALUE('<cases><case/></cases>', 'count(/cases/case)') 
    AS 'count() Example';
+---------------+-----------------+
| Empty Example | count() Example |
+---------------+-----------------+
|               |               1 |
+---------------+-----------------+

В противном случае, когда искомое значение не существует, функция count() возвращает 0.

SELECT
   EXTRACTVALUE('<cases><case/></cases>', '/cases/person') 
    AS 'No Match Example',
   EXTRACTVALUE('<cases><case/></cases>', 'count(/cases/person)') 
    AS 'count() Example';
+------------------+-----------------+
| No Match Example | count() Example |
+------------------+-----------------+
|                  |                0|
+------------------+-----------------+

Совпадения

Важно: Функция EXTRACTVALUE() возвращает только CDDATA. Она не возвращает теги, которые может содержать элемент, или текст, содержащийся в этих дочерних элементах.

SELECT 
  EXTRACTVALUE('<cases><case>Person<email>x@example.com</email></case></cases>', '/cases')
   AS Case;
+--------+
| Case   |
+--------+
| Person |
+--------+

Обратите внимание, что в приведенном выше примере, хотя выражение XPath соответствует родительскому элементу <case>, оно не возвращает содержащийся <email> тег или его содержимое.

Примеры

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 |
+------+------+------+------+---------+
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/extractvalue/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API