首页 新闻 会员 周边 捐助

oracle 提取 <XMLTYPE> 数据

0
悬赏园豆:200 [已解决问题] 解决于 2019-10-24 10:54

如何过滤节点中的 !<CDATA[……]] 部分信息。
下面是原文档:

<e_enum sid="AF02DF916E974BA1891EA824701878CB" iid="51C475710AC64178B702DD2C9F8DF2B8" range_kind="2" isnull="0" title="发育(入院)" datatype="S" code="ZLEMR.PE.019253" placeholder="发育(入院)" value_form="S" min_length="0" max_length="0" min_scale="0" max_scale="0" choicestyle="0" displaystyle="0" textstyleno="2" br="0">
    <enumvalues>
        <element sid="AF02DF916E974BA1891EA824701878CB" title="发育(入院)" showtext="发育正常" datatype="S">1</element>
    </enumvalues>
    <![CDATA[ rangexml='<root><multisel>0</multisel><item><value>1</value><meaning>发育正常</meaning></item><item><value>2</value><meaning>发育异常:</meaning></item><showmode>2</showmode><y_prefix /><n_prefix /></root>']]>
发育正常
</e_enum>

已提取出来的信息如下:

<![CDATA[ rangexml='<root><multisel>0</multisel><item><value>1</value><meaning>发育正常</meaning></item><item><value>2</value><meaning>发育异常:</meaning></item><showmode>2</showmode><y_prefix /><n_prefix /></root>']]>
发育正常

我的想法是使用正则表达式去掉不需要的部分,不过正则表达式在oracle比较弱,无法生效,SQL如下;

select regexp_replace('<![CDATA[ rangexml=''<root><multisel>0</multisel><item><value>1</value><meaning>发育正常</meaning></item><item><value>2</value><meaning>发育异常:</meaning></item><showmode>2</showmode><y_prefix /><n_prefix /></root>'']]>
发育正常','(1\<\!\[CDATA\[(?<text>[^\]]*)\]\]\>)','') a from dual

我能确定正则表达式没有问题,因为我用正则表达式测试工具测试了,能达到预期结果

静看岁月荏苒的主页 静看岁月荏苒 | 初学一级 | 园豆:24
提问于:2019-10-19 10:35
< >
分享
最佳答案
0

思路:首先把 '<[CDATA[' 替换为特殊字符,比如,@ ;再把 ']]>' 替换为 #;然后再用 regexp_replace()函数进行匹配
代码如下:

select regexp_replace(replace(replace('<![CDATA[ rangexml=''<root><multisel>0</multisel><item><value>1</value><meaning>发育正常</meaning></item><item><value>2</value><meaning>发育异常:</meaning></item><showmode>2</showmode><y_prefix /><n_prefix /></root>'']]>
发育正常','<![CDATA[','@'),']]>','#'),'@.*?#','') a from dual

结果:
发育正常

静看岁月荏苒 | 初学一级 |园豆:24 | 2019-10-24 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册