PL/SQL转换特殊字符

frg*_*v10 5 oracle plsql

我正在使用填充表中数据的简短PL/SQL函数创建一个简单的XML 1.0文件.

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

 newXmlString := REPLACE(xmlString,    '&',  '&amp;' );
 newXmlString := REPLACE(newXmlString, '\',  '' );
 newXmlString := REPLACE(newXmlString, '<',  '&lt;' );
 newXmlString := REPLACE(newXmlString, '>',  '&gt;' );
 newXmlString := REPLACE(newXmlString, '"',  '&quot;' );
 newXmlString := REPLACE(newXmlString, '''', '&apos;' );
Run Code Online (Sandbox Code Playgroud)

现在表中有更多数据,因为特殊的控制字符(https://en.wikipedia.org/wiki/Control_character),XML文件无法验证:

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

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

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

newXmlString := REPLACE(newXmlString, chr(3), '' ); -- ETX end of text
Run Code Online (Sandbox Code Playgroud)

但是,是否有一个内置函数或类似于我可以与PL/SQL一起使用而无需列出和搜索+替换它们的库?

更新1

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

更新2

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

小智 1

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

请注意字符串开头的“a”,它作为第二个字符串中的唯一字符返回。该功能需要一个未被消除的字符。

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;
Run Code Online (Sandbox Code Playgroud)