Encode les caractères dans les entités de caractères pour XML
Question
J'ai une variable définie comme suit:
D content 1280A CONST
Je dois trouver les "
, &
, '
, <
, caractères >
et les remplacer par:
"
, &
, '
, <
et >
; respectivement.
J'ai vu des fonctions XML dans la langue, mais ceux-ci ne semble pas être ce que je dois. Mais je peux me tromper alors voici que je vous demande.
Utilisation RPGLE, freeform.
Solution : Peut-être pas très RPG-ish, mais cela a fonctionné
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
La solution
Peut-être est simple d'esprit de moi, mais serait-il suffisant pour simplement utiliser la fonction% remplacer intégrée? Je veux dire, vous auriez à utiliser à plusieurs reprises, pour les différentes choses que vous remplacez. Mais ce qu'il ya des cas particuliers ce genre de remplacement de la défaite sans esprit? (Je pense à la fréquence des gens essaient de CSVs juste parse en brisant sans réfléchir sur des virgules, par exemple. Cela ne va pas bien pour certains ensembles de données.)
Autres conseils
Il y a une fonction% scanrpl qui remplacera toutes les occurrences d'une chaîne par une autre chaîne. Il semble que le billet à chaud.