巧用xmltype解析clob数据(r2笔记33天)
对于clob的数据,很多场合中都使用xml的格式,但是对于数据的查取和处理总是感觉力不从心。在条件允许的情况下,如果能够巧妙的使用xmltype来做数据处理,无意中是对于clob的一个处理利器。
简单说下需求。
数据库里存放的clob类似下面的格式
<ObjectInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Relations>
<RelationInfo relationType="BackReference">
<RelatedObjects>
<RelatedObjectInfo objID="##PC4.0##118146" />
<RelatedObjectInfo objID="##PC4.0##30369" />
<RelatedObjectInfo objID="##PC4.0##118145" />
<RelatedObjectInfo objID="##PC4.0##118211" />
<RelatedObjectInfo objID="##PC4.0##117696" />
<RelatedObjectInfo objID="##PC4.0##119094" />
<RelatedObjectInfo objID="##PC4.0##118203" />
<RelatedObjectInfo objID="##PC4.0##118133" />
<RelatedObjectInfo objID="##PC4.0##118135" />
<RelatedObjectInfo objID="##PC4.0##118583" />
<RelatedObjectInfo objID="##PC4.0##30313" />
<RelatedObjectInfo objID="##PC4.0##30310" />
<RelatedObjectInfo objID="##PC4.0##110154" />
<RelatedObjectInfo objID="##PC4.0##30317" />
<RelatedObjectInfo objID="##PC4.0##30314" />
<RelatedObjectInfo objID="##PC4.0##30315" />
<RelatedObjectInfo objID="##PC4.0##30318" />
<RelatedObjectInfo objID="##PC4.0##118131" />
<RelatedObjectInfo objID="##PC4.0##30309" />
<RelatedObjectInfo objID="##PC4.0##118160" />
<RelatedObjectInfo objID="##PC4.0##119101" />
</RelatedObjects>
</RelationInfo>
</Relations>
</ObjectInfo>
现在有一个需求是能够把RelatedObjectInfo 中的objID查取,整理后得到一个以逗号分隔的串。
比如上面的clob数据,需要输出成为下面的形式:
##PC4.0##118146,##PC4.0##30369,##PC4.0##118145,##PC4.0##118211,##PC4.0##117696,##PC4.0##119094,##PC45.0##118203,
如果直接通过sql语句来写,确实很难实现,如果通过Pl/sql也需要做不少的工作。
下面尝试使用xmltype来直接读取clob数据。
简单创建一个测试表,插入数据。
create table AA(id number,c_cml clob);
insert into aa values(5,to_clob('
<ObjectInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Relations>
<RelationInfo relationType="BackReference">
<RelatedObjects>
<RelatedObjectInfo objID="##PC4.0##118146" />
<RelatedObjectInfo objID="##PC4.0##30369" />
<RelatedObjectInfo objID="##PC4.0##118145" />
<RelatedObjectInfo objID="##PC4.0##118211" />
<RelatedObjectInfo objID="##PC4.0##117696" />
<RelatedObjectInfo objID="##PC4.0##119094" />
<RelatedObjectInfo objID="##PC4.0##118203" />
<RelatedObjectInfo objID="##PC4.0##118133" />
<RelatedObjectInfo objID="##PC4.0##118135" />
<RelatedObjectInfo objID="##PC4.0##118583" />
<RelatedObjectInfo objID="##PC4.0##30313" />
<RelatedObjectInfo objID="##PC4.0##30310" />
<RelatedObjectInfo objID="##PC4.0##110154" />
<RelatedObjectInfo objID="##PC4.0##30317" />
<RelatedObjectInfo objID="##PC4.0##30314" />
<RelatedObjectInfo objID="##PC4.0##30315" />
<RelatedObjectInfo objID="##PC4.0##30318" />
<RelatedObjectInfo objID="##PC4.0##118131" />
<RelatedObjectInfo objID="##PC4.0##30309" />
<RelatedObjectInfo objID="##PC4.0##118160" />
<RelatedObjectInfo objID="##PC4.0##119101" />
</RelatedObjects>
</RelationInfo>
</Relations>
</ObjectInfo>
'));
来看看xmltype的效果,根据根节点,找到最终的叶子节点。
select extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo') a,
id
from aa where id=5;
A ID
---------------------------------------------------------------------------------------------------- --------
<RelatedObjectInfo objID="##PC4.0##118146"/><RelatedObjectInfo objID="##PC4.0##30369"/><RelatedObjec 5
tInfo objID="##PC4.0##118145"/><RelatedObjectInfo objID="##PC4.0##118211"/><RelatedObjectInfo objID=
"##PC4.0##117696"/><RelatedObjectInfo objID="##PC4.0##119094"/><RelatedObjectInfo objID="##PC4.0##11
8203"/><RelatedObjectInfo objID="##PC4.0##118133"/><RelatedObjectInfo objID="##PC4.0##118135"/><Rela
tedObjectInfo objID="##PC4.0##118583"/><RelatedObjectInfo objID="##PC4.0##30313"/><RelatedObjectInfo
objID="##PC4.0##30310"/><RelatedObjectInfo objID="##PC4.0##110154"/><RelatedObjectInfo objID="##PC4
.0##30317"/><RelatedObjectInfo objID="##PC4.0##30314"/><RelatedObjectInfo objID="##PC4.0##30315"/><R
elatedObjectInfo objID="##PC4.0##30318"/><RelatedObjectInfo objID="##PC4.0##118131"/><RelatedObjectI
nfo objID="##PC4.0##30309"/><RelatedObjectInfo objID="##PC4.0##118160"/><RelatedObjectInfo objID="##
PC4.0##119101"/>
可以看到已经查到了<RelatedObjectInfo>这部分的数据。
更进一步,把xml标记进行清除。可以直接使用replace
SQL> select replace(extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo'),'<RelatedObjectInfo objID="','') a,
2 id
3 from aa where id=5;
A ID
---------------------------------------------------------------------------------------------------- --------
##PC4.0##118146"/>##PC4.0##30369"/>##PC4.0##118145"/>##PC4.0##118211"/>##PC4.0##117696"/>##PC4.0##11 5
9094"/>##PC4.0##118203"/>##PC4.0##118133"/>##PC4.0##118135"/>##PC4.0##118583"/>##PC4.0##30313"/>##PC
4.0##30310"/>##PC4.0##110154"/>##PC4.0##30317"/>##PC4.0##30314"/>##PC4.0##30315"/>##PC4.0##30318"/>#
#PC4.0##118131"/>##PC4.0##30309"/>##PC4.0##118160"/>##PC4.0##119101"/>
然后直接清除尾部标记。
SQL> select replace(replace(extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo'),'<RelatedObjectInfo objID="',''),'"/>',',') a,
2 id
3 from aa where id=5;
A ID
---------------------------------------------------------------------------------------------------- --------
##PC4.0##118146,##PC4.0##30369,##PC4.0##118145,##PC4.0##118211,##PC4.0##117696,##PC4.0##119094,##PC4 5
.0##118203,##PC4.0##118133,##PC4.0##118135,##PC4.0##118583,##PC4.0##30313,##PC4.0##30310,##PC4.0##11
0154,##PC4.0##30317,##PC4.0##30314,##PC4.0##30315,##PC4.0##30318,##PC4.0##118131,##PC4.0##30309,##PC
4.0##118160,##PC4.0##119101,
这样就能很快实现需求,把clob的数据当做xml来做处理,当然了对于clob的数据格式也是有一些限定的。
- Leetcode-Easy 155. Min Stack
- Leetcode-Easy 72. Edit Distance
- React第三方组件4(状态管理之Reflux的使用③TodoList中)
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 150+行Python代码实现带界面的数独游戏
- Python实现十大经典排序算法
- 140行Python代码实现Flippy Bird
- 200行Python代码实现贪吃蛇
- 简单说维特比算法 - python实现
- Android绘图及Bitmap几个知识点整理
- Spark Pipeline官方文档
- Python-时间及日期-07-获取本周或上周几具体日期
- Spark Job-Stage-Task实例理解
- 想查看微信好友撤回的消息?Python帮你搞定
- MySQL 案例:同步中断与SQL线程类型转换
- Android端Charles抓包
- Spring boot 启动提示数据源错误
- leetcode树之从上到下打印二叉树
- 整理C/C++的可变参数