1. 程式人生 > >C#過濾XML(十六進位制值 0x1D)無效的字元

C#過濾XML(十六進位制值 0x1D)無效的字元

載入或儲存XML時引發的異常.System.ArgumentException: “”(十六進位制值 0x1D)是無效的字元。
產生原因是xml檔案中包含低位非列印字元造成的
處理方法:在產生xml檔案的時候,過濾低位非列印字元

把一個字串中的 低序位 ASCII 字元 替換成 &#x  字元
轉換  ASCII  0 - 8  -> � -
轉換  ASCII 11 - 12 -> -
轉換  ASCII 14 - 31 -> -

  1. return System.Text.RegularExpressions.Regex.Replace(HttpUtility.HtmlEncode(str),@"[\x00-\x08]|[\x0B-\x0C]|[\x0E-\x1F]", "");  


  1. /// <summary>
  2. /// 把一個字串中的 低序位 ASCII 字元 替換成   字元
  3. /// 轉換  ASCII  0 - 8  -> � - 
  4. /// 轉換  ASCII 11 - 12 ->   - 
  5. /// 轉換  ASCII 14 - 31 ->  - 
  6. /// </summary>
  7. /// <param name="tmp"></param>
  8. /// <returns></returns>
  9. publicstaticstring ReplaceLowOrderASCIICharacters(string tmp)  
  10. {  
  11.     StringBuilder info = new
     StringBuilder();  
  12.     foreach (char cc in tmp)  
  13.     {  
  14.         int ss = (int)cc;  
  15.         if (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))  
  16.             info.AppendFormat("{0:X};", ss);  
  17.         else info.Append(cc);  
  18.     }  
  19.     return info.ToString();  
  20. }  
  21. /// <summary>
  22. /// 把一個字串中的下列字元替換成 低序位 ASCII 字元
  23. /// 轉換  � -   -> ASCII  0 - 8
  24. /// 轉換    -    -> ASCII 11 - 12
  25. /// 轉換   -  -> ASCII 14 - 31
  26. /// </summary>
  27. /// <param name="input"></param>
  28. /// <returns></returns>
  29. publicstaticstring GetLowOrderASCIICharacters(string input)  
  30. {  
  31.     if (string.IsNullOrEmpty(input)) returnstring.Empty;  
  32.     int pos, startIndex = 0, len = input.Length;  
  33.     if (len <= 4) return input;  
  34.     StringBuilder result = new StringBuilder();  
  35.     while ((pos = input.IndexOf("", startIndex)) >= 0)  
  36.     {  
  37.         bool needReplace = false;  
  38.         string rOldV = string.Empty, rNewV = string.Empty;  
  39.         int le = (len - pos < 6) ? len - pos : 6;  
  40.         int p = input.IndexOf(";", pos, le);  
  41.         if (p >= 0)  
  42.         {  
  43.             rOldV = input.Substring(pos, p - pos + 1);  
  44.             // 計算 對應的低位字元
  45.             short ss;  
  46.             if (short.TryParse(rOldV.Substring(3, p - pos - 3), System.Globalization.NumberStyles.AllowHexSpecifier, nullout ss))  
  47.             {  
  48.                 if (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))  
  49.                 {  
  50.                     needReplace = true;  
  51.                     rNewV = Convert.ToChar(ss).ToString();  
  52.                 }  
  53.             }  
  54.             pos = p + 1;  
  55.         }  
  56.         else pos += le;  
  57.         string part = input.Substring(startIndex, pos - startIndex);  
  58.         if (needReplace) result.Append(part.Replace(rOldV, rNewV));  
  59.         else result.Append(part);  
  60.         startIndex = pos;  
  61.     }  
  62.     result.Append(input.Substring(startIndex));  
  63.     return result.ToString();