2015-04-20 88 views
5

我堅持從XML文件中刪除無效字符。我發現,應該剝奪一切什麼是不可用正則表達式:從XML字符串c刪除非法字符#

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]"; 
    return Regex.Replace(text, re, ""); 
} 

這裏是我的代碼,它從SQL Server讀取數據(當然,一個片段)

using (var cmd = new SqlCommand(Context.Command, connection)) 
{ 
    cmd.CommandTimeout = Context.CommandTimeout; 

    using (var reader = cmd.ExecuteReader()) 
    { 

     StringBuilder xmlResults = new StringBuilder(string.Empty); 

     while (reader.Read()) 
     { 
      xmlResults.Append(reader.GetString(0)); 
     } 

     if (!string.IsNullOrWhiteSpace(xmlResults.ToString())) 
     { 
      var doc = new XmlDocument(); 
      XmlReader xmlReader = XmlReader.Create(new StringReader(xmlResults.ToString())); 

      doc.Load(xmlReader); 

      var nav = doc.CreateNavigator(); 
      var objs = nav.Select("/index/type"); 

      foreach (XPathNavigator obj in objs) 
      { 
       o.OnNext(obj); 
      } 
     } 

    } 
} 

我已經試過包裝CleanInvalindXmlChars在不同的地方:

while (reader.Read()) 
{ 
    xmlResults.Append(CleanInvalindXmlChars(reader.GetString(0))); 
} 

或者在

XmlReader xmlReader = XmlReader.Create(new StringReader(CleanInvalindXmlChars(xmlResults.ToString()))); 

我正在閱讀的一個單元格中有一個x0B符號(我可以在SQL Server中替換它,但我希望在此安全)。

但是,我總是結束了錯誤

System.Xml.XmlException: '',十六進制值0x0B中,是一個無效字符 。 115行,位置33407.

任何人都可以幫助我解決這個問題嗎?

+1

你在'x10FFFF'之前缺少一個反斜槓。但是,我懷疑這會解決問題。 –

+0

您是否嘗試使用'input = Regex.Replace(input,@「[\ x0B]」,string.Empty)刪除這個'VT'符號;'?此外,我相信你需要這個無效的XML字符正則表達式 - '[\ u0000- \ u0008 \ u000B- \ u000C \ u000E- \ u0019] +' - 匹配並從字符串中刪除所有無效的XML字符。 –

回答

1

這是一個基於非正則表達式的方法來清理您的字符串數據。我已經添加0x0B中未由所述正則表達式除去你已經張貼:

public static string stripNonValidXMLCharacters(string textIn) 
{ 
    if (String.IsNullOrEmpty(textIn)) 
     return textIn; 

    StringBuilder textOut = new StringBuilder(textIn.Length); 

    foreach (Char current in textIn) 
     if ((current == 0x9 || current == 0xA || current == 0xB || current == 0xD) || 
      ((current >= 0x20) && (current <= 0xD7FF)) || 
      ((current >= 0xE000) && (current <= 0xFFFD)) || 
      ((current >= 0x10000) && (current <= 0x10FFFF))) 
      textOut.Append(current); 

    return textOut.ToString(); 
} 
+0

我試過你的方法,但是我仍然面臨問題。也許我把'stripNonValidXMLCharacters'放在錯誤的地方?我在做這個'XmlReader xmlReader = XmlReader.Create(new StringReader(stripNonValidXMLCharacters(xmlResults.ToString())));' 對不起,打擾了,但我完全新的c# –

+0

我改變了它到一個靜態的方法,這應該可以解決您的問題 – Jaco

+0

謝謝,它解決了它。 –

2

Here是與所接受answer以及交替answer我更喜歡(代碼下面複製)同樣的問題。

public static string XmlCharacterWhitelist(string in_string) { 
    if(in_string == null) return null; 

    StringBuilder sbOutput = new StringBuilder(); 
    char ch; 

    for(int i = 0; i < in_string.Length; i++) { 
     ch = in_string[i]; 
     if((ch >= 0x0020 && ch <= 0xD7FF) || 
      (ch >= 0xE000 && ch <= 0xFFFD) || 
      ch == 0x0009 || 
      ch == 0x000A || 
      ch == 0x000D) { 
      sbOutput.Append(ch); 
     } 
    } 
    return sbOutput.ToString(); 
}