摘要: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 FROMtest-# (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数据处理实际》,原文作者:拂晓的风。
点击关注,第一工夫理解华为云陈腐技术~