摘要: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 数据的解析,将所需的数据以表的模式返回,便于对数据进一步的查问和剖析。
上面演示一个对音讯数据的解析流程:
- 创立一张用于存储音讯数据的表,插入数据。
CREATE TABLE MSGS AS SELECT 1 AS ID, ‘A,BB,CCC,DDDD,EEEEE’ AS MSG;
- 将音讯文本数据通过 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)
- 应用 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 数据处理实际》,原文作者:拂晓的风。
点击关注,第一工夫理解华为云陈腐技术~