我正在使用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。
select regexp_replace(sr.column1,'(&|< )','<![CDATA[\1]]>') from dual;
但是,regexp_replace
(和所有regexp_*
函数)通常比使用普通replace
慢,因为它们执行更复杂的逻辑。您的问题实际上是您要尝试修复的
invalid XML,这是一个很难的问题!理想的解决方案是首先避免使用无效的XML-如果可能的话,应转义特殊字符最初生成XML时。内置功能可以快速完成此操作,例如DBMS_XMLGEN.CONVERT或HTF.ESCAPE_SC。