摘要:GaussDB(DWS)支援XML資料型別及豐富的XML解析函式,可實現關係資料和XML資料的對映管理功能。
XML概述
XML是可擴充套件的標識語言(eXtensible Markup Language)的縮寫,可以描述非常複雜的資料結構,廣泛應用於傳輸和儲存資料。XML是一種類似於HTML的標記語言,但XML沒有使用預定義的標記,可以根據應用需求定義標記。XML的基本格式是標準化的,可以跨平臺、作業系統和應用程式實現異構系統之間的資料共享。
XML資料型別
GaussDB(DWS)支援將XML文件儲存在資料庫的XML資料型別列中。通過XML資料型別來儲存資料,相比於文字方式的優勢在於具有資料結構檢查功能,能夠保證結構的正確,並且支援XML資料解析和處理函式。
判斷一個 XML 文件正確的標準是:
- 文件必須是一個格式良好的文件。
- 文件遵循 XML 所有的語法規則並且有效。
- 文件遵循特定語義的規則,這些規則通常規定在 XML 或 DTD 規範中
XML可以儲存由XML標準定義的格式正確的文件,以及由XML標準中定義的內容片斷,內容片斷可以有多個頂級元素或字元節點。
下面是一個格式良好的XML文件示例:
<?xml version="1.0" encoding="UTF-8"?> <message> Hello GaussDB(DWS) </message>
可以使用INSERT SQL語句將格式良好的文件插入到XML列中,如果能夠成功分析文件,那麼就說明文件的格式正確。在執行插入或更新操作前,會根據配置引數來驗證XML文件是否格式正確。
在應用程式中的XML資料一般採用其序列化字串格式,將資料插入到 XML 列中時,必須將它轉換為 XML 分層格式。因此在執行插入操作時可顯式呼叫 XMLPARSE 函式,以將資料從其序列化字串格式轉換為 XML 分層格式。
test=# SELECT XMLPARSE(document '<root>GAUSSDB(DWS)</root>'); xmlparse --------------------------- <root>GAUSSDB(DWS)</root> (1 row)
訪問XML值
當訪問和處理XML資料時,由於XML資料在資料庫內部的表示不是字串,XML資料型別沒有提供比較操作符,因此不能直接與字串進行比較。這樣的結果是無法通過比較XML數值和搜尋值來檢索到資料行,因此對於XML資料應該伴隨一個ID值用於檢索資料。
通過使用 XMLSERIALIZE 函式,可以將 XML 值變換成表示 XML 文件的已序列化字串值。
test=# SELECT XMLSERIALIZE(document '<root>GAUSSDB(DWS)</root>' AS TEXT); xmlserialize --------------------------- <root>GAUSSDB(DWS)</root> (1 row)
XML解析函式
目前GaussDB(DWS)已經支援了30多個XML解析函式,包括解析XML資料、生成XML內容、XML謂詞、XML引數設定、將資料對映到XML等功能。
處理XML資料的函式
- xpath 對xml值計算xpath表示式的結果
- xmltable 通過XPath表示式的方式對XML資料進行解析
生成XML內容的函式
- xmlparse 字元資料轉換為xml型別的值
- xmlserialize xml型別轉換為字串
- xmlcomment 建立一個包含XML註釋的特定文字內容的值
- xmlconcat 連線獨立的XML值列表來建立一個包含XML內容片段的單值
- xmlelement 生成一個帶有給定名稱,屬性和內容的XML元素。
- xmlforest 生成一個使用指定的名稱和內容的XML森林(序列)元素
- xmlpi 建立一條XML處理指令
- xmlroot 更改XML值的根節點屬性
- xmlagg 聚合函式,連線聚合函式呼叫的輸入值
XML謂詞函式
- IS DOCUMENT 判斷XML值是否為文件
- IS NOT DOCUMENT 判斷XML值是否為文件
- xmlexists 判斷XPath表示式是否返回任何節點
- xpath_exists 判斷XPath表示式是否返回任何節點
- xml_is_well_formed 檢查字串是不是格式良好的XML
- xml_is_well_formed_document 檢查字串是不是格式良好的XML文件
- xml_is_well_formed_content 檢查字串是不是格式良好的XML內容
XML引數設定
- SET XML OPTION 設定XML格式
- SET XMLBINARY TO 設定二進位制值在XML中的編碼格式
將表、查詢、遊標、資料庫對映到XML的函式
- table_to_xml、query_to_xml、cursor_to_xml、database_to_xml等。
具體每個函式的使用方法可以參考GaussDB(DWS)使用者手冊,下面主要介紹應用中常見的解析XML資料的XMLTABLE函式。
XMLTABLE函式概述
XMLTABLE函式通過XPath表示式的方式對XML資料進行解析,按照定義的列生成一個表將資料返回,返回的表可以包含任何 SQL 資料型別(包括 XML型別)。
XMLTABLE函式支援將表中的XML資料或一個SELECT查詢的XML資料作為變數傳遞到指定的XPath表示式上,通過XPath表示式解析XML資料後的結果用於產生表中的列值,生成的表的結構由 XMLTABLE 的 COLUMNS 子句定義,可以指定列名、資料型別和生成列值的方式來定義列的特徵。
下面演示一下XMLTABLE函式的使用方法,首先建立CUSTOMER表並插入包含客戶資訊的XML資料。
CREATE TABLE CUSTOMER AS SELECT 1 AS ID, XML $$ <ROWS> <ROW ID="1"> <CUSTOMER_NAME>Tony</CUSTOMER_NAME> <PHONENUM>123-456-666</PHONENUM> </ROW> <ROW ID="2"> <CUSTOMER_NAME>Serena</CUSTOMER_NAME> <PHONENUM>123-456-888</PHONENUM> </ROW> <ROW ID="3"> <CUSTOMER_NAME>Tina</CUSTOMER_NAME> <PHONENUM>123-456-999</PHONENUM> </ROW> </ROWS> $$ AS INFO;
通過以下 SELECT 語句在 XMLTABLE 函式中解析 CUSTOMER 表的 INFO 列。
SELECT XMLTABLE.* FROM CUSTOMER, XMLTABLE('//ROWS/ROW' PASSING INFO COLUMNS ID INT PATH '@ID', NAME VARCHAR(64) PATH 'CUSTOMER_NAME', PHONENUM TEXT PATH 'PHONENUM'); id | name | phonenum ----+--------+------------- 1 | Tony | 123-456-666 2 | Serena | 123-456-888 3 | Tina | 123-456-999 (3 rows)
在GaussDB(DWS)上,XMLTABLE函式支援下推到資料節點DN執行的STREAM查詢計劃,XML資料在資料節點上進行解析生成XMLTABLE結果表,通過GATHER STREAM將結果彙總到協調節點CN上,能夠下推到DN的STREAM計劃具有較好的查詢效能。
XMLTABLE應用案例
在業務場景中,經常會遇到需要解析XML文件的場景,使用XMLTABLE函式可以快捷方便的完成對XML資料的解析,將所需的資料以表的形式返回,便於對資料進一步的查詢和分析。
下面演示一個對訊息資料的解析流程:
1. 建立一張用於儲存訊息資料的表,插入資料。
CREATE TABLE MSGS AS SELECT 1 AS ID, 'A,BB,CCC,DDDD,EEEEE' AS MSG;
2. 將訊息文字資料通過XMLPARSE函式轉化為XML資料。
test=# SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS; xml_msg ----------------------------------------------------------- <r><c>A</c><c>BB</c><c>CCC</c><c>DDDD</c><c>EEEEE</c></r> (1 row)
3. 使用XMLTABLE函式對XML資料進行解析,逐條返回訊息內容。
test=# SELECT MSG_CONTENT FROM test-# (SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS), test-# XMLTABLE('/r/c/text()' PASSING XML_MSG COLUMNS MSG_CONTENT VARCHAR(4000) PATH '.'); msg_content ------------- A BB CCC DDDD EEEEE (5 rows)
從上圖中可以看到,XMLTABLE解析後的資料以表的形式返回,在這個XMLTABLE表上可以進一步的對資料排序、篩選等操作,同時GaussDB(DWS)也支援在函式或儲存過程中進行XML資料的處理,使應用程式的開發非常便捷。
總結
GaussDB(DWS)支援了XML資料型別及豐富的XML解析函式,同時基於Shared Nothing的分散式架構具有良好的並行處理和擴充套件能力,對XML資料的解析任務可下推到資料節點上進行並行處理,完全能夠滿足應用中出現的XML資料解析需求。
本文分享自華為雲社群《GaussDB(DWS) XML資料處理實踐》,原文作者:黎明的風。