2015-12-11 171 views
5

Sto creando un semplice file XML 1.0 con l'aiuto di una breve funzione PL/SQL piena di dati da una tabella.Conversione di caratteri speciali PL/SQL

I dati della tabella contengono anche caratteri HTML come <>, & e così via. Per questi caratteri speciali che ho costruire una breve ricerca e la funzione che assomiglia a questo sostituire:

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

Ora ci sono più dati nella tabella che ha l'effetto che il file XML non è in grado di convalidare a causa di caratteri di controllo speciali (https://en.wikipedia.org/wiki/Control_character) come:

  • ETX (Fine del testo)
  • SYN (Synchronous Idle)

Nota: non tutti i caratteri di controllo corrompono la convalida di un file XML! Linebreaks o Carriage Return è ancora possibile.

Certo che ora possono cercare e li sostituisco così, ad esempio con:

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

Ma c'è un accumulo in funzione o qualcosa di simile a una libreria è possibile utilizzare con PL/SQL senza elencare e di ricerca + sostituendoli?

UPDATE 1

Ho anche cercato di utilizzare la funzione dbms_xmlgen.getxml ma questa funzione genera un errore a causa del 'carattere speciale alla conversione char sfuggito fallito.' +

UPDATE 2

Ho provato a utilizzare REGEXP_REPLACE(STRING_VALUE,'[[:cntrl:]]') che funzionerà, ma questo eliminerà anche le interruzioni di riga, che vogliamo mantenere e non ha alcun effetto sulla convalida di un file XML.

+1

penso 'dbms_xmlgen.convert()' è quello che stai cercando –

+0

@a_horse_with_no_name: questo permette di convertire i caratteri HTML ma anche non i caratteri di controllo come 'SYN' – frgtv10

+0

Ma usando che non è necessario prendersi cura di tutti i caratteri HTML, solo i caratteri di controllo. –

risposta

1

TRANSLATE è davvero la strada da percorrere. Costruisci una stringa con la funzione CHR e applicala una sola volta. Ecco un esempio per ETX: 3, EOT: 4 e SYN: 22. È possibile aggiungerne altri quando necessario.

Si noti 'a' all'inizio della stringa che restituisce l'unico carattere nella seconda stringa. Questa funzione richiede un chracter che non viene eliminato.

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; 
+0

Grazie per questa ottima funzione – frgtv10