caratteri di codifica in entità carattere per XML
Domanda
Ho una variabile definita come:
D content 1280A CONST
Ho bisogno di trovare le "
, &
, '
, <
, personaggi >
e sostituirli con:
"
, &
, '
, <
e >
; rispettivamente.
Ho visto alcune funzioni XML nel linguaggio, ma questi non sembrano essere quello che mi serve. Ma potrei sbagliarmi ecco sto chiedendo.
Utilizzando RPGLE, di forma irregolare.
Soluzione : forse non molto RPG-ish ma ha funzionato
P encode B
D PI 1280A
D content 1280A CONST
D outStr S 1280A
D strDsp S 50A
/free
outStr = %trim(content);
outStr = replaceAll('&' : '&' : outStr);
outStr = replaceAll('"' : '"' : outStr);
outStr = replaceAll('''' : ''' : outStr);
outStr = replaceAll('>' : '>' : outStr);
outStr = replaceAll('<' : '<' : outStr);
return outStr;
/end-free
P E
P*** Procedure: replaceAll ************************************
P*** IN: character to replace, replacement text, source
P*** OUT: transformed string
P replaceAll B
D PI 1280A
D character 1A CONST
D rText 10A CONST
D content 1280A CONST
D outStr S 1280A
D dspStr S 50A
D rSize S 3P 0 //replacement text size
D index S 3P 0 //cur str index
D cntSize S 3P 0 //content size
/free
rSize = %len(%trim(rText));
cntSize = %len(%trim(content));
outStr = content;
for i = 1 to cntSize; //scan starts at character 1 not 0
index = %scan(character : outStr : i);
if index = 0;
leave;
endif;
outStr = %replace(%trim(rText) : outStr : index : 1);
i = index + 1;
endfor;
return outStr;
/end-free
P E
Soluzione
Forse questo è ingenuo di me, ma sarebbe sufficiente utilizzare solo il built-in funzione di sostituire%? Voglio dire, che avrebbe dovuto usarlo più volte, per le diverse cose che si sta sostituendo. Ma ci sono casi speciali che tipo di sconfitta la sostituzione senza cervello? (Sto pensando a quanto spesso le persone cercano di CSV appena parse da stupidamente rottura su virgole, per esempio. Questo non va bene per alcune serie di dati.)
Altri suggerimenti
C'è una funzione scanrpl% che andrà a sostituire tutte le occorrenze di una stringa con un'altra stringa. Sembra che il biglietto caldo.