写点什么

处理 XML 数据应用实践

发布于: 2021 年 02 月 25 日

摘要: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;


  1. 将消息文本数据通过 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)
复制代码


  1. 使用 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 数据处理实践》,原文作者:黎明的风。


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 02 月 25 日阅读数: 15
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论 (1 条评论)

发布
用户头像
好久没用xml了
2021 年 02 月 28 日 11:11
回复
没有更多了
处理XML数据应用实践