Codieren Zeichen in Zeicheneinheiten für XML
Frage
Ich habe eine Variable definiert als:
D content 1280A CONST
Ich muss das finden "
, &
, '
, <
, >
Zeichen und ersetzen Sie sie durch:
"
, &
, '
, <
, und >
; beziehungsweise.
Ich habe einige XML -Funktionen in der Sprache gesehen, aber diese scheinen nicht das zu sein, was ich brauche. Aber ich könnte mich irren, also frage ich hier.
Mit Rpgle, Freeform.
Lösung: Vielleicht nicht sehr RPG-ish, aber es hat funktioniert
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
Lösung
Vielleicht ist das von mir einfach, aber würde es ausreichen, nur die integrierte %Ersatzfunktion zu verwenden? Ich meine, Sie müssten es wiederholt verwenden, um die verschiedenen Dinge zu ersetzen. Aber gibt es besondere Fälle, die einen sinnlosen Ersatz für den sinnlosen Ersatz besiegen? (Ich denke darüber nach, wie oft Menschen versuchen, CSVs nur durch sinnlos gegen Kommas zu brechen. Das läuft für einige Datensätze nicht gut.)
Andere Tipps
Es gibt eine %scanRPL -Funktion, die alle Vorkommen einer Zeichenfolge durch eine andere Zeichenfolge ersetzt. Es sieht aus wie das heiße Ticket.