KingbaseES 原生XML系列二--XML数据操作函数(DELETEXML,APPENDCHILDXML,INSERTCHILDXML,INSERTCHILDXMLAFTER,INSERTCHILDXMLBEFORE,INSERTXMLAFTER,INSERTXMLBEFORE,UPDATEXML)

XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的一种公共语言。在不同平台下产生的信息,可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

xml数据类型可以被用来存储XML数据。它比直接在一个text域中存储XML数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作。

本文详细介绍了KingbaseES中集成的相关xml数据操作函数使用。

准备数据:

CREATE TABLE "public"."xmldata" (
"id" integer NULL,
"comm" varchar NULL,
"xmlvarchar" varchar NULL,
"xmldata" xml NULL,
"XMLarray" xml NULL
); INSERT INTO xmldata values(1, 'zhangsan' , '<kes>aaa</kes>' , '<kes><sql>sql001</sql><rac>rac001</rac></kes>' , '<kes><version>v8r3001</version><version>v8r6001</version></kes>');
INSERT INTO xmldata values(2, 'lisi' , '<kes>bbb</kes>' , '<kes><sql>sql002</sql><rac>rac002</rac></kes>' , '<kes><version>v8r3002</version><version>v8r6002</version></kes>');
INSERT INTO xmldata values(3, 'wangwu' , '<kes>ccc</kes>' , '<kes><sql>sql003</sql><rac>rac003</rac></kes>' , '<kes><version>v8r3003</version><version>v8r6003</version></kes>');

xml函数列表

json函数简介

DELETEXML

功能:

函数deletexml会删除xml_instance实例中与xpath表达式匹配的节点。

每次删除指定的一层节点,若一层含有多个节点,则该层所有节点都将被删除。若删除节点后父节点值为空,则父节点只显示结尾部分,否则显示完整父节点及父节点的其他值。

用法:

deletexml(xml_instance xml, xpath text)
deletexml(xml_instance xml, xpath text, namespace _text)

示例:

test=# select deletexml(xmlvarchar , '/kes') , xmlvarchar from xmldata ;
deletexml | xmlvarchar
-----------+----------------
| <kes>aaa</kes>
| <kes>bbb</kes>
| <kes>ccc</kes>
(3 行记录) test=# select deletexml(xmldata , '/kes/sql') , xmldata from xmldata ;
deletexml | xmldata
---------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<rac>rac001</rac>+|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<rac>rac002</rac>+|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<rac>rac003</rac>+|
</kes> |
(3 行记录) test=# select deletexml(xmlarray , '/kes/version') , xmlarray from xmldata ;
deletexml | xmlarray
-----------+-----------------------------------------------------------------
<kes/> | <kes><version>v8r3001</version><version>v8r6001</version></kes>
<kes/> | <kes><version>v8r3002</version><version>v8r6002</version></kes>
<kes/> | <kes><version>v8r3003</version><version>v8r6003</version></kes>
(3 行记录)

APPENDCHILDXML

功能:

函数appendchildxml将value_expr提供的值作为xpath节点的子节点追加到xml_instance中。成功则返回追加后的xml_instance数据,失败则返回ERROR。

用法:

appendchildxml(xml_instance xml,  xpath text , value_expr xml)

示例:

test=# select appendchildxml(xmldata , '/kes' ,xmlvarchar) , xmldata , xmlvarchar from xmldata ;
appendchildxml | xmldata | xmlvarchar
---------------------+-----------------------------------------------+----------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes> | <kes>aaa</kes>
<sql>sql001</sql>+| |
<rac>rac001</rac>+| |
<kes>aaa</kes> +| |
</kes> | |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes> | <kes>bbb</kes>
<sql>sql002</sql>+| |
<rac>rac002</rac>+| |
<kes>bbb</kes> +| |
</kes> | |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes> | <kes>ccc</kes>
<sql>sql003</sql>+| |
<rac>rac003</rac>+| |
<kes>ccc</kes> +| |
</kes> | |
(3 行记录)

INSERTCHILDXML

功能:

函数insertchildxml将value_expr提供的值作为xpath指定节点的子节点插入到xml_instance中。成功则返回插入后的xml_instance数据,失败则返回ERROR。

用法:

insertchildxml(xml_instance xml,  xpath text, child_expr text , value_expr xml)
insertchildxml(xml_instance xml, xpath text , child_expr text ,value_expr xml, namespace _text)

示例:

test=# select insertchildxml(xmldata , '/kes' , 'cluster' , '<cluster>nodes</cluster>') ,xmldata from xmldata ;
insertchildxml | xmldata
----------------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<sql>sql001</sql> +|
<rac>rac001</rac> +|
<cluster>nodes</cluster>+|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<sql>sql002</sql> +|
<rac>rac002</rac> +|
<cluster>nodes</cluster>+|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<sql>sql003</sql> +|
<rac>rac003</rac> +|
<cluster>nodes</cluster>+|
</kes> |
(3 行记录) -- 数组数据插入
test=# select insertchildxml(XMLarray , '/kes' , 'cluster' , '<cluster>nodes</cluster>') , XMLarray from xmldata ;
insertchildxml | XMLarray
------------------------------+-----------------------------------------------------------------
<kes> +| <kes><version>v8r3001</version><version>v8r6001</version></kes>
<version>v8r3001</version>+|
<version>v8r6001</version>+|
<cluster>nodes</cluster> +|
</kes> |
<kes> +| <kes><version>v8r3002</version><version>v8r6002</version></kes>
<version>v8r3002</version>+|
<version>v8r6002</version>+|
<cluster>nodes</cluster> +|
</kes> |
<kes> +| <kes><version>v8r3003</version><version>v8r6003</version></kes>
<version>v8r3003</version>+|
<version>v8r6003</version>+|
<cluster>nodes</cluster> +|
</kes> |
(3 行记录)

INSERTCHILDXMLAFTER

功能:

函数insertchildxmlafter将value_expr提供的一个或多个集合元素作为xpath指定的目标父元素的子元素插入到child_expr指定的现有集合元素之后。成功则返回插入后的xml_instance数据,失败则返回ERROR。

用法:

insertchildxmlafter(xml_instance xml,  xpath text, child_expr text , value_expr xml)
insertchildxmlafter(xml_instance xml, xpath text , child_expr text ,value_expr xml,namespace _text)

示例:

test=# select insertchildxmlafter(xmldata , '/kes','sql','<cluster>nodes</cluster>') ,xmldata from xmldata ;
insertchildxmlafter | xmldata
----------------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<sql>sql001</sql> +|
<cluster>nodes</cluster>+|
<rac>rac001</rac> +|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<sql>sql002</sql> +|
<cluster>nodes</cluster>+|
<rac>rac002</rac> +|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<sql>sql003</sql> +|
<cluster>nodes</cluster>+|
<rac>rac003</rac> +|
</kes> |
(3 行记录) -- 数组数据插入
test=# select insertchildxmlafter(xmlarray ,'/kes','version[1]' ,'<cluster>nodes</cluster>') ,xmlarray from xmldata ;
insertchildxmlafter | xmlarray
------------------------------+-----------------------------------------------------------------
<kes> +| <kes><version>v8r3001</version><version>v8r6001</version></kes>
<version>v8r3001</version>+|
<cluster>nodes</cluster> +|
<version>v8r6001</version>+|
</kes> |
<kes> +| <kes><version>v8r3002</version><version>v8r6002</version></kes>
<version>v8r3002</version>+|
<cluster>nodes</cluster> +|
<version>v8r6002</version>+|
</kes> |
<kes> +| <kes><version>v8r3003</version><version>v8r6003</version></kes>
<version>v8r3003</version>+|
<cluster>nodes</cluster> +|
<version>v8r6003</version>+|
</kes> |
(3 行记录)

INSERTCHILDXMLBEFORE

功能:

函数insertchildxmlbefore将value_expr提供的一个或多个集合元素作为xpath指定的目标父元素的子元素插入到child_expr指定的现有集合元素之前。成功则返回插入后的xml_instance数据,失败则返回ERROR。

用法:

insertchildxmlbefore(xml_instance xml,  xpath text, child_expr text , value_expr xml)
insertchildxmlbefore(xml_instance xml, xpath text , child_expr text , value_expr xml,namespace _text)

示例:

test=# select insertchildxmlbefore(xmldata , '/kes','sql','<cluster>nodes</cluster>') ,xmldata from xmldata ;
insertchildxmlbefore | xmldata
----------------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql001</sql> +|
<rac>rac001</rac> +|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql002</sql> +|
<rac>rac002</rac> +|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql003</sql> +|
<rac>rac003</rac> +|
</kes> |
(3 行记录) -- 数组数据插入
test=# select insertchildxmlbefore(xmlarray ,'/kes','version[1]' ,'<cluster>nodes</cluster>') ,xmlarray from xmldata ;
insertchildxmlbefore | xmlarray
------------------------------+-----------------------------------------------------------------
<kes> +| <kes><version>v8r3001</version><version>v8r6001</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3001</version>+|
<version>v8r6001</version>+|
</kes> |
<kes> +| <kes><version>v8r3002</version><version>v8r6002</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3002</version>+|
<version>v8r6002</version>+|
</kes> |
<kes> +| <kes><version>v8r3003</version><version>v8r6003</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3003</version>+|
<version>v8r6003</version>+|
</kes> |
(3 行记录)

INSERTXMLAFTER

功能:

函数insertxmlafter将value_expr提供的值插入到xpath指定的节点之后。成功则返回插入后的xml_instance数据,失败则返回ERROR。

用法:

insertxmlafter(xml_instance xml,  xpath text , value_expr xml)
insertxmlafter(xml_instance xml, xpath text , value_expr xml,namespace _text)

示例:

test=# select insertxmlafter(xmldata ,'/kes/sql' ,'<cluster>nodes</cluster>') ,xmldata  from xmldata ;
insertxmlafter | xmldata
----------------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<sql>sql001</sql> +|
<cluster>nodes</cluster>+|
<rac>rac001</rac> +|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<sql>sql002</sql> +|
<cluster>nodes</cluster>+|
<rac>rac002</rac> +|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<sql>sql003</sql> +|
<cluster>nodes</cluster>+|
<rac>rac003</rac> +|
</kes> |
(3 行记录) -- 数组数据插入
test=# select insertxmlafter(xmlarray ,'/kes/version[1]' ,'<cluster>nodes</cluster>') , xmlarray from xmldata ;
insertxmlafter | xmlarray
------------------------------+-----------------------------------------------------------------
<kes> +| <kes><version>v8r3001</version><version>v8r6001</version></kes>
<version>v8r3001</version>+|
<cluster>nodes</cluster> +|
<version>v8r6001</version>+|
</kes> |
<kes> +| <kes><version>v8r3002</version><version>v8r6002</version></kes>
<version>v8r3002</version>+|
<cluster>nodes</cluster> +|
<version>v8r6002</version>+|
</kes> |
<kes> +| <kes><version>v8r3003</version><version>v8r6003</version></kes>
<version>v8r3003</version>+|
<cluster>nodes</cluster> +|
<version>v8r6003</version>+|
</kes> |
(3 行记录)

INSERTXMLBEFORE

功能:

函数insertxmlbefore将value_expr提供的值插入到xpath指定的节点之前。成功则返回插入后的xml_instance数据,失败则返回ERROR。

用法:

insertxmlbefore(xml_instance xml,  xpath text , value_expr xml)
insertxmlbefore(xml_instance xml, xpath text , value_expr xml,namespace _text)

示例:

test=# select insertxmlbefore(xmldata ,'/kes/sql' ,'<cluster>nodes</cluster>') ,xmldata  from xmldata ;
insertxmlbefore | xmldata
----------------------------+-----------------------------------------------
<kes> +| <kes><sql>sql001</sql><rac>rac001</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql001</sql> +|
<rac>rac001</rac> +|
</kes> |
<kes> +| <kes><sql>sql002</sql><rac>rac002</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql002</sql> +|
<rac>rac002</rac> +|
</kes> |
<kes> +| <kes><sql>sql003</sql><rac>rac003</rac></kes>
<cluster>nodes</cluster>+|
<sql>sql003</sql> +|
<rac>rac003</rac> +|
</kes> |
(3 行记录) -- 数组数据插入
test=# select insertxmlbefore(xmlarray ,'/kes/version[1]' ,'<cluster>nodes</cluster>') , xmlarray from xmldata ;
insertxmlbefore | xmlarray
------------------------------+-----------------------------------------------------------------
<kes> +| <kes><version>v8r3001</version><version>v8r6001</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3001</version>+|
<version>v8r6001</version>+|
</kes> |
<kes> +| <kes><version>v8r3002</version><version>v8r6002</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3002</version>+|
<version>v8r6002</version>+|
</kes> |
<kes> +| <kes><version>v8r3003</version><version>v8r6003</version></kes>
<cluster>nodes</cluster> +|
<version>v8r3003</version>+|
<version>v8r6003</version>+|
</kes> |
(3 行记录)

UPDATEXML

功能:

函数updatexml将xml_instance实例中xpath指定的节点内容替换为value_expr提供的值,成功则返回更新后的xml_instance实例,失败则返回ERROR。

用法:

updatexml(xml_instance xml, xpath text, value_expr xml)
updatexml(xml_instance xml, xpath text, value_expr text)
updatexml(xml_instance xml, xpath text, value_expr text, namespace text)

示例:

test=# select updatexml(xmlvarchar ,'/kes' ,'<kes>xxx</kes>' ) , xmlvarchar from xmldata ;
updatexml | xmlvarchar
----------------+----------------
<kes>xxx</kes> | <kes>aaa</kes>
<kes>xxx</kes> | <kes>bbb</kes>
<kes>xxx</kes> | <kes>ccc</kes>
(3 行记录)

KingbaseES 原生XML系列二 -- XML数据操作函数的更多相关文章

  1. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...

  2. Python股票分析系列——基础股票数据操作(一).p3

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...

  3. Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数

    JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数                             ...

  4. 【summary】JQuery 相关css、ajax、数据操作函数或方法

    总结一下JQuery常用的函数方法,更加系统的整理一下. JQuery遍历的一些函数: 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集 ...

  5. ORACLE链接SQLSERVER数据库数据操作函数范例

    ORACLE链接SQLSERVER数据库数据操作函数范例 create or replace function FUN_NAME(LS_DJBH IN varchar2 ,LS_ITM varchar ...

  6. 学习ASP.NET Core Blazor编程系列二十一——数据刷新

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  7. mysql全家桶(二)数据操作

    一.数据操作1.增#新增insert into 表名(字段列表) values(值列表);INSERT INTO table_name ( field1, field2,...fieldN ) VAL ...

  8. WebService(2)-XML系列之用Stax操作Xml

    源代码下载:链接: http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:利用Stax处理xml文档 一.读取xml 1.基于光标的查找 核心:X ...

  9. Python股票分析系列——基础股票数据操作(二).p4

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...

  10. Redis学习二(数据操作).

    key 操作 删除 key:del key 批量删除key:redis-cli -a(密码)keys "QXJ_*"| xargs redis-cli -a(密码)del 查看所有 ...

随机推荐

  1. React闭包陷阱

    React闭包陷阱 React Hooks是React 16.8引入的一个新特性,其出现让React的函数组件也能够拥有状态和生命周期方法,其优势在于可以让我们在不编写类组件的情况下,更细粒度地复用状 ...

  2. Springboot+JdbcTemplate模拟SQL注入攻击案例及解决方法

    说明 SQL注入是软件开发项目测试过程中必测项,重要等级极高.本文以springboot项目为例,模拟含有SQL注入攻击,并提供解决方法.部分内容整理自网络. 搭建项目 1.创建表tbuser DRO ...

  3. pikachu php反序列化漏洞

    原理 php中serialize(),unserialize()这两个函数. 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ p ...

  4. 在Hexo中引入本地图片的实现

    实现步骤 第一步:修改项目根目录下的_config.yml文件参数post_asset_folder值为true. # 开始使用本地静态资源 post_asset_folder: true 第二步:安 ...

  5. stat模块

    # stat模块定义了常数和函数,并用这些来解释os.stat().os.fstat()和os.lstat()的结果(如果这些在该平台上存在的话). stat.S_ISREG(mode) # 判断mo ...

  6. 【C# .Net】继承重写父类方法,C# 与 JAVA的不同之处

    一直都没仔细研究c#重写,new关键字的作用,最近在回头看书,复习C#基础的时候才发现了 C# 重写和 JAVA大不一样的地方. C# 提供特定实现的子类可以重写(override)标识为 virtu ...

  7. 【Azure 应用服务】在安全漏洞扫描中发现有泄露服务器IIS版本的情况,如何实现屏蔽服务版本号信息呢?

    问题描述 当对Azure App Service应用进行安全扫描时,发现了HTTP/S请求的响应头中会包含服务端IIS的版本信息,这是一个低风险因素. 如: Server: Microsoft-IIS ...

  8. go grpc流式和非流式的例子

    参考grpc官方:  https://grpc.io/docs/quickstart/go.html 或官方中文翻译: http://doc.oschina.net/grpc?t=60133 安装pr ...

  9. 聊聊微信小程序的流式(stream)响应请求

    场景:类似ChatGPT的逐字显示效果. 流程:服务端我用Python的flask框架(向外提供API接口)实现,服务部署在replit上,Python调用azure 的chatgpt服务(需要申请) ...

  10. Java 异常处理(2) : 异常处理的方式二:throws + 异常类型

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...