XPath 是導覽與查詢 XML 文件的語言。MySQL 提供 ExtractValue() 與 UpdateXML() 兩大核心函數支援 XML 資料處理。
UpdateXML() 用於依據 XPath 表達式匹配並替換 XML 片段。語法:
UpdateXML(XML_frag, xpath_expr, new_xml)
將 <city>Chicago</city> 替換為 <city>New York</city>:
SELECT @new_xml_node := UpdateXML('Chicago ', '//city', 'New York ') AS XML_node;
ExtractValue() 配合 XPath count() 函數判斷SHOW WARNINGS 查看不檢查型別與賦值狀態,拼寫錯誤不報錯,返回 NULL/none。範例:
SET @XML_cities = 'Chicago Ocean City Baltimore ';
SET @state_index_first = 1, @state_index_second = 2;
SELECT @state_index_first, ExtractValue(@XML_cities, '//state[$@state_index_first]') AS 'First City';
-- 結果: Chicago
SELECT @state_index_second, ExtractValue(@XML_cities, '//state[$@state_index_second]') AS 'Second City';
-- 結果: Ocean City
SELECT @state_index_third, ExtractValue(@XML_cities, '//state[$@state_index_third]') AS 'Third City';
-- 結果: NULL (變數未定義)
需在預存程序中 DECLARE 宣告,具型別與值檢查。範例:
DELIMITER |
CREATE PROCEDURE get_cities(IN XML_data VARCHAR(255))
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE city_name VARCHAR(100);
CREATE TEMPORARY TABLE cities (
match_number INT UNSIGNED NOT NULL DEFAULT 0,
name VARCHAR(100) NULL
);
SET city_name = ExtractValue(XML_data, '//state[$i]');
WHILE city_name != '' DO
INSERT INTO cities SELECT i, city_name;
SET i = i + 1;
SET city_name = ExtractValue(XML_data, '//state[$i]');
END WHILE;
SELECT * FROM cities;
DROP TABLE cities;
END |
DELIMITER ;
CALL get_cities(@XML_cities);
MySQL XML 功能雖有限制,但版本迭代持續增強。期待未來支援 JSON 等更精簡資料格式。