處理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值用於檢索數據。

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM