W MariaDB, EXTRACTVALUE()
jest wbudowaną funkcją ciągu, która zwraca CDATA z fragmentu XML.
Działa to tak, że akceptuje dwa argumenty łańcuchowe:fragment znacznika XML i wyrażenie XPath (tj. lokalizator). EXTRACTVALUE()
następnie zwraca CDATA (tj. tekst) pierwszego węzła tekstowego, który jest dzieckiem elementu lub elementów pasujących do wyrażenia XPath.
Składnia
Składnia wygląda tak:
EXTRACTVALUE(xml_frag, xpath_expr)
Gdzie xml_frag
jest fragmentem XML, a xpath_expr
jest wyrażeniem XPath do dopasowania.
Przykład
Oto podstawowy przykład:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type') AS "Result";
Wynik:
+--------+ | Result | +--------+ | Cat | +--------+
W tym przypadku ścieżka XPath to /type
, a więc zwraca CDATA (tekst) z type
element.
Oto kolejny:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user') AS "Result";
Wynik:
+--------+ | Result | +--------+ | Homer | +--------+
W tym przypadku ścieżka XPath to /user
, a więc EXTRACTVALUE()
zwraca CDATA od user
element.
Zauważ, że nie zwrócił iq
elementu lub jego tekstu. Można się tego spodziewać, ponieważ EXTRACTVALUE()
zwraca tylko CDATA. Nie zwraca żadnych elementów podrzędnych ani tekstu, który mogą one zawierać.
Korzystanie z wyrażenia text()
Jest to odpowiednik uzyskania dopasowania przez dodanie jawnego text()
wyrażenie:
SELECT EXTRACTVALUE('<type>Cat</type>', '/type/text()') AS "Result";
Wynik:
+--------+ | Result | +--------+ | Cat | +--------+
Elementy zagnieżdżone
Oto przykład pobierania CDATA z elementu zagnieżdżonego:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/user/iq') AS "Result";
Wynik:
+--------+ | Result | +--------+ | Low | +--------+
Tutaj mamy CDATA z iq
element, który jest zagnieżdżony w user
element. Osiągnęliśmy to za pomocą /user/iq
jako XPath.
Brak dopasowania
Jeśli taki element nie istnieje, nic nie jest zwracane.
Przykład:
SELECT EXTRACTVALUE('<type>Cat</type>', '/name') AS "Result";
Wynik:
+--------+ | Result | +--------+ | | +--------+
Dzieje się tak również w przypadku nieprawidłowego zagnieżdżenia.
Przykład:
SELECT EXTRACTVALUE('<user>Homer<iq>Low</iq></user>', '/iq') AS "Result";
Wynik:
+--------+ | Result | +--------+ | | +--------+
Tutaj użyliśmy /iq
jako XPath, kiedy powinniśmy użyć /user/iq
.
Pusty plik XML
Pusty dokument XML da pusty wynik:
SELECT EXTRACTVALUE('', '/name') AS "Result";
Wynik:
+--------+ | Result | +--------+ | | +--------+
Pusta ścieżka XPath
Pusta ścieżka XPath zwraca błąd:
SELECT EXTRACTVALUE('<type>Cat</type>', '');
Wynik:
ERROR 1105 (HY000): XPATH syntax error: ''
Pusty XML
Podanie null
ponieważ pierwszy argument powoduje błąd:
SELECT EXTRACTVALUE(null, '');
Wynik:
ERROR 1105 (HY000): XPATH syntax error: ''
Zerowa ścieżka XPath
Podanie null
jako drugi argument zwraca null
:
SELECT EXTRACTVALUE('<type>Cat</type>', null) AS "Result";
Wynik:
+--------+ | Result | +--------+ | NULL | +--------+
Podawanie tylko jednego argumentu
Podanie pojedynczego argumentu skutkuje błędem:
SELECT EXTRACTVALUE('<type>Cat</type>');
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Brakujący argument
Wywołanie EXTRACTVALUE()
bez przekazywania jakichkolwiek argumentów powoduje błąd:
SELECT EXTRACTVALUE();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'EXTRACTVALUE'
Wprowadzenie do XML
Aby uzyskać więcej informacji na temat XML, zobacz mój samouczek XML na Quackit. Ten samouczek zawiera również wprowadzenie do XPath.