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

     

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

  • 相关阅读:
    google 语音识别返回,
    如果到来,会是怎样情况,fuck,
    sql
    阅读《一》
    阅读,
    Codevs 1078 ==Poj 1258 Agri-Net
    洛谷 P3399 丝绸之路
    线段树-代码实现细节与技巧
    Codevs 1371 浴火银河跑运输
    POJ 3267 The Cow Lexicon
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14445487.html
Copyright © 2020-2023  润新知