将字符编码为XML的字符实体

时间:2011-01-21 19:17:48

标签: rpgle rpg

我有一个变量定义为:

D content                     1280A   CONST 

我需要找到"&'<>字符并将其替换为:

&quot;&amp;&apos;&lt;&gt;分别

我在语言中看到了一些XML函数,但这些似乎并不是我需要的。但我可能错了所以我在这里问。

使用RPGLE,自由格式。

解决方案:也许不是RPG-ish但它有效

P encode          B             
D                 PI          1280A        
D content                     1280A   CONST    
D outStr          S           1280A                       
D strDsp          S             50A 
 /free 
   outStr = %trim(content);   
   outStr = replaceAll('&' : '&amp;' : outStr);  
   outStr = replaceAll('"' : '&quot;' : outStr);  
   outStr = replaceAll('''' : '&apos;' : outStr);     
   outStr = replaceAll('>' : '&gt;' : outStr);    
   outStr = replaceAll('<' : '&lt;' : 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         

2 个答案:

答案 0 :(得分:4)

也许这对我来说很简单,但仅仅使用内置的%replace函数就足够了吗?我的意思是,你必须反复使用它,因为你正在取代不同的东西。但有没有特殊情况可以打败无意识的替代品呢? (我正在考虑人们试图通过无意识地打破逗号来解析CSV的频率。例如,对于某些数据集来说,这并不顺利。)

答案 1 :(得分:3)

有一个%scanrpl函数可以用另一个字符串替换所有出现的字符串。它看起来像热门票。