GaussDB(DWS) XML数据处理实践

网友投稿 1017 2022-05-29

XML概述

XML是可扩展的标识语言(eXtensible Markup Language)的缩写,可以描述非常复杂的数据结构,广泛应用于传输和存储数据。XML是一种类似于HTML的标记语言,但XML没有使用预定义的标记,可以根据应用需求定义标记。XML的基本格式是标准化的,可以跨平台、操作系统和应用程序实现异构系统之间的数据共享。

XML数据类型

GaussDB(DWS)支持将XML文档存储在数据库的XML数据类型列中。通过XML数据类型来保存数据,相比于文本方式的优势在于具有数据结构检查功能,能够保证结构的正确,并且支持XML数据解析和处理函数。

判断一个 XML 文档正确的标准是:

文档必须是一个格式良好的文档。

文档遵循 XML 所有的语法规则并且有效。

文档遵循特定语义的规则,这些规则通常规定在 XML 或 DTD 规范中

XML可以存储由XML标准定义的格式正确的文档,以及由XML标准中定义的内容片断,内容片断可以有多个顶级元素或字符节点。

下面是一个格式良好的XML文档示例:

Hello GaussDB(DWS)

可以使用INSERT SQL语句将格式良好的文档插入到XML列中,如果能够成功分析文档,那么就说明文档的格式正确。在执行插入或更新操作前,会根据配置参数来验证XML文档是否格式正确。

在应用程序中的XML数据一般采用其序列化字符串格式,将数据插入到 XML 列中时,必须将它转换为 XML 分层格式。因此在执行插入操作时可显式调用 XMLPARSE 函数,以将数据从其序列化字符串格式转换为 XML 分层格式。

test=# SELECT XMLPARSE(document 'GAUSSDB(DWS)'); xmlparse --------------------------- GAUSSDB(DWS) (1 row)

访问XML值

当访问和处理XML数据时,由于XML数据在数据库内部的表示不是字符串,XML数据类型没有提供比较操作符,因此不能直接与字符串进行比较。这样的结果是无法通过比较XML数值和搜索值来检索到数据行,因此对于XML数据应该伴随一个ID值用于检索数据。

通过使用 XMLSERIALIZE 函数,可以将 XML 值变换成表示 XML 文档的已序列化字符串值。

test=# SELECT XMLSERIALIZE(document 'GAUSSDB(DWS)' AS TEXT); xmlserialize --------------------------- GAUSSDB(DWS) (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值是否为文档

GaussDB(DWS) 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 $$ Tony 123-456-666 Serena 123-456-888 Tina 123-456-999 $$ 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 '' || REPLACE(MSG, ',', '') ||'') AS XML_MSG FROM MSGS; xml_msg ----------------------------------------------------------- ABBCCCDDDDEEEEE (1 row)

3. 使用XMLTABLE函数对XML数据进行解析,逐条返回消息内容。

test=# SELECT MSG_CONTENT FROM test-# (SELECT XMLPARSE(content '' || REPLACE(MSG, ',', '') ||'') 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数据解析需求。

EI企业智能 Gauss AP XML 数据仓库服务 GaussDB(DWS)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux共享内存及函数
下一篇:smbexec的使用(c$共享)
相关文章