如何在 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.
我正在 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.