PL / SQL转换特殊字符

时间:2015-12-11 08:15:35

标签: oracle plsql

我在一个简短的PL / SQL函数的帮助下创建了一个简单的XML 1.0文件,该函数填充了表中的数据。

表格中的数据还包含HTML字符,例如<>,&等等。 对于这些特殊字符,我构建了一个简短的搜索和替换函数,如下所示:

 newXmlString := REPLACE(xmlString,    '&',  '&' );
 newXmlString := REPLACE(newXmlString, '\',  '' );
 newXmlString := REPLACE(newXmlString, '<',  '&lt;' );
 newXmlString := REPLACE(newXmlString, '>',  '&gt;' );
 newXmlString := REPLACE(newXmlString, '"',  '&quot;' );
 newXmlString := REPLACE(newXmlString, '''', '&apos;' );

现在表中有更多数据会导致XML文件由于特殊控制字符(https://en.wikipedia.org/wiki/Control_character)而无法验证,如:

  • ETX(文字结束)
  • SYN(同步空闲)

注意:并非每个控制字符都会破坏XML文件的验证!仍然可以使用换行符或回车符。

当然我现在也可以搜索和替换它们,例如:

newXmlString := REPLACE(newXmlString, chr(3), '' ); -- ETX end of text

但是有没有内置函数或类似于我可以在没有列表和搜索+替换它们的情况下使用PL / SQL的库?

更新1

我也试过使用函数dbms_xmlgen.getxml但是这个函数抛出一个错误,因为'转义字符转换的特殊字符失败了。'+

更新2

我尝试使用REGEXP_REPLACE(STRING_VALUE,'[[:cntrl:]]'),但这也会删除我们要保留的换行符,也不会影响XML文件的验证。

1 个答案:

答案 0 :(得分:1)

TRANSLATE确实是要走的路。使用CHR函数构建一个字符串并仅应用一次。 以下是ETX的示例:3,EOT:4和SYN:22。您可以在需要时附加其他内容。

注意&#39; a&#39;在字符串的开头,作为第二个字符串中的唯一字符返回。 此功能需要一个未消除的字符。

FUNCTION clean_control( in_text IN VARCHAR2 )
   RETURN VARCHAR2
IS
   v_search  VARCHAR2( 30 ) := 'a' || CHR( 3 ) || CHR( 4 ) || CHR( 22 );
BEGIN
   RETURN TRANSLATE( in_text, v_search, 'a' );
END;