處理XML資料應用實踐

華為雲開發者社群發表於2021-02-25
摘要: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型別)。

處理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計劃具有較好的查詢效能。

處理XML資料應用實踐

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資料處理實踐》,原文作者:黎明的風。

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章