如何在Oracle SQL中有效替换XML中的特殊字符?

问题描述 投票:0回答:1

我正在使用oracle sql解析xml。

XMLType(replace(column1,'&','<![CDATA[&]]>')) //column1 is a column name that has xml data

解析时,我将'&'临时包装在CDATA中,以防止任何xml异常。消除由“&”引起的异常后,我得到“在Name或Nmtoken中发现无效字符32('')”。这是因为'

E.g: <child> 40 < 50 </child> // This causes the above exception.

所以我尝试了以下方法,它可以工作。

XMLType(replace(replace(column1,'&','<![CDATA[&]]>'),'< ','<![CDATA[< ]]>'))

在上面,我在CDATA中包装了'

 Input : <child> 40 & < 50 </child>
 Expected Output : <child> 40 <![CDATA[&]]> <![CDATA[< ]]> 50 </child>

注意:有时用&号替换'&'会导致'实体引用格式不正确'例外。因此,我选择包装CDATA。

sql xml oracle xmltype xmltable
1个回答
0
投票
您可以使用这样的正则表达式来做到这一点:

select regexp_replace(sr.column1,'(&|< )','<![CDATA[\1]]>') from dual;

但是,regexp_replace(和所有regexp_*函数)通常比使用普通replace慢,因为它们执行更复杂的逻辑。

您的问题实际上是您要尝试修复的

invalid XML,这是一个很难的问题!理想的解决方案是首先避免使用无效的XML-如果可能的话,应转义特殊字符最初生成XML时。内置功能可以快速完成此操作,例如DBMS_XMLGEN.CONVERTHTF.ESCAPE_SC

© www.soinside.com 2019 - 2024. All rights reserved.