我在一个简短的PL / SQL函数的帮助下创建了一个简单的XML 1.0文件,该函数填充了表中的数据。
表格中的数据还包含HTML字符,例如<>,&等等。 对于这些特殊字符,我构建了一个简短的搜索和替换函数,如下所示:
newXmlString := REPLACE(xmlString, '&', '&' );
newXmlString := REPLACE(newXmlString, '\', '' );
newXmlString := REPLACE(newXmlString, '<', '<' );
newXmlString := REPLACE(newXmlString, '>', '>' );
newXmlString := REPLACE(newXmlString, '"', '"' );
newXmlString := REPLACE(newXmlString, '''', ''' );
现在表中有更多数据会导致XML文件由于特殊控制字符(https://en.wikipedia.org/wiki/Control_character)而无法验证,如:
注意:并非每个控制字符都会破坏XML文件的验证!仍然可以使用换行符或回车符。
当然我现在也可以搜索和替换它们,例如:
newXmlString := REPLACE(newXmlString, chr(3), '' ); -- ETX end of text
但是有没有内置函数或类似于我可以在没有列表和搜索+替换它们的情况下使用PL / SQL的库?
更新1
我也试过使用函数dbms_xmlgen.getxml
但是这个函数抛出一个错误,因为'转义字符转换的特殊字符失败了。'+
更新2
我尝试使用REGEXP_REPLACE(STRING_VALUE,'[[:cntrl:]]')
,但这也会删除我们要保留的换行符,也不会影响XML文件的验证。
答案 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;