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

How to efficiently replace special characters in an XML in Oracle SQL?

我正在 oracle sql 中解析 xml。

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

解析时,我暂时将“&”包裹在 CDATA 中以防止任何 xml 异常。摆脱由“&”引起的异常后,我得到 "invalid character 32 (' ') found in a Name or Nmtoken"。这是因为 '<' 字符。

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

所以我尝试了下面的方法并且有效。

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

在上面,我在 CDATA 中包装了“<”(小于符号后跟 space)。但是上面的有点耗时。所以我正在尝试使用正则表达式来减少所花费的时间。 有谁知道如何在 Oracle sql 中使用正则表达式实现上述操作??

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

注意:用 & 符号分号替换“&”有时会导致 'entity reference not well formed' 异常。因此我选择包装在 CDATA 中。

你可以用这样的正则表达式来做到这一点:

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

然而,regexp_replace(以及所有 regexp_* 函数)通常比使用普通 replace 慢,因为它们执行更复杂的逻辑。所以我不确定它是否会更快。

您可能已经意识到,但您的根本问题是您开始时尝试修复的 无效 XML,即一个难题!理想的解决方案是首先不要使用无效的 XML - 如果可能,您应该在最初生成 XML 时转义特殊字符 。有一些内置函数可以快速做到这一点,比如 DBMS_XMLGEN.CONVERT or HTF.ESCAPE_SC.