在Oracle中读取XML,XPath的使用和特殊字符处理

最近在做读取Oracle数据库中XML的项目。之前在MSSQL中使用过XPath读取,非常方便。最近这个Oracle也打算试试。好久不用略有生疏。简单介绍一下。

读取前要保存XML,这个很简单,在Oracle中建立一个CLOB类型的字段即可。更新的SQL如下:

DECLARE
       V_xml CLOB :='<xml><name id="1">test1</name><name id="2">test2</name></xml>';
BEGIN
update tablename SET colname=V_xml where ID='1111222454f4913a9df93c718356af8';
END;

存储XML注意一下特殊字符,在XML只有”<”、”&”等字符是不能直接存入,理论替换两个即可。所以相对来说XML对特殊字符的处理比较简单。如下五个是xml预定义的实体引用,替换成第一列的转义字符即可:

&lt;<小于
&gt;>大于
&amp;&和号
&apos;'单引号
&quot;"引号

注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

替换之后通过XPath读取,会自动被xml解析器解析。同时XML中还提供了一种<![CDATA[]]>来包含不被xml解析器解析的内容,内层中括号里面的内容,被解析器当做纯文本处理。有几个问题要注意:

1、CDATA 部分不能包含字符串 "]]>"。
2、不允许嵌套的 CDATA 部分。
3、标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

使用转义字符和<![CDATA[]]>差不多,一般建议较长的文本用<![CDATA[]]>,因为<![CDATA[]]>的解析速度比较快。较短的字符用转义即可,cdata写起来太啰嗦。

 

言归正传,读取XML是最关键的。还是以上面保存的XML为例。查找在XML中name节点id=1和id=2的值:

SELECT
  nvl(extractvalue(xmltype(t.colname),'/xml/name[@id="1"]'),'test3') as name1,
  nvl(extractvalue(xmltype(t.colname),'/xml/name[@id="2"]'),'test4') as name2
FROM tablename t

取值的都是基于过程基于XPath语法,XML使用起来和MSSQL基本没有区别。

另外唯一Oracle和MSSQL区别就是对于null的判读。MSSQL中null和空,是两种不同数据;但Oracle中null和空,是一样的。上面这段中nvl就是判断是否为空或null,如果为空加一个默认值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值