如何过滤节点中的 !<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
我能确定正则表达式没有问题,因为我用正则表达式测试工具测试了,能达到预期结果
思路:首先把 '<[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
结果:
发育正常