В MariaDB, EXTRACTVALUE()
е вградена низова функция, която връща CDATA от XML фрагмент.
Начинът, по който работи е, че приема два аргумента на низ:фрагмент от XML маркиране и XPath израз (т.е. локатор). EXTRACTVALUE()
след това връща CDATA (т.е. текста) на първия текстов възел, който е дъщерно на елемента или елементите, съответстващи на израза XPath.
Синтаксис
Синтаксисът е така:
EXTRACTVALUE(xml_frag, xpath_expr)
Където xml_frag
е XML фрагментът и xpath_expr
е XPath изразът за съвпадение.
Пример
Ето един основен пример:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| Котка |+--------+
В този случай XPath е /type
, и така връща CDATA (текст) от type
елемент.
Ето още един:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| Омир |+--------+
В този случай XPath е /user
, и така EXTRACTVALUE()
връща CDATA от user
елемент.
Забележете, че не върна iq
елемент или неговия текст. Това може да се очаква, защото EXTRACTVALUE()
връща само CDATA. Той не връща никакви дъщерни елементи или текст, който може да съдържа.
Използване на израза text()
Това е еквивалентно на получаване на съвпадение чрез добавяне на изричния text()
израз:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| Котка |+--------+Вложени елементи
Ето пример за получаване на CDATA от вложен елемент:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| Ниска |+--------+
Тук имаме CDATA от iq
елемент, който е вложен в user
елемент. Постигнахме това с помощта на /user/iq
като XPath.
Няма съвпадение
Ако такъв елемент не съществува, нищо не се връща.
Пример:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| |+--------+Такъв е и случаят, ако сбъркате влагането.
Пример:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| |+--------+
Тук използвахме /iq
като XPath, когато трябваше да използваме /user/iq
.
Празен XML
Празен XML документ ще даде празен резултат:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| |+--------+Празен XPath
Празен XPath връща грешка:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Резултат:
ГРЕШКА 1105 (HY000):Синтактична грешка на XPATH:''
Нулев XML
Предоставяне на null
тъй като първият аргумент води до грешка:
SELECT EXTRACTVALUE(null, '');
Резултат:
ГРЕШКА 1105 (HY000):Синтактична грешка на XPATH:''
Null XPath
Предоставяне на null
като вторият аргумент връща null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Резултат:
<пред>+--------+| Резултат |+--------+| NULL |+--------+Предоставяне само на един аргумент
Предоставянето на един аргумент води до грешка:
SELECT EXTRACTVALUE('<type>Cat</type>');
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой параметри в извикването на естествена функция „EXTRACTVALUE“
Липсващ аргумент
Извикване на EXTRACTVALUE()
без подаване на аргументи води до грешка:
SELECT EXTRACTVALUE();
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой параметри в извикването на естествена функция „EXTRACTVALUE“
Въведение в XML
За повече информация относно XML вижте моя XML урок в Quackit. Този урок включва и въведение в XPath.