處理XML數據應用實踐

摘要: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值用於檢索數據。url

經過使用 XMLSERIALIZE 函數,能夠將 XML 值變換成表示 XML 文檔的已序列化字符串值。spa

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數據處理實踐》,原文做者:黎明的風。

 

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

相關文章
相關標籤/搜索