2015-04-20 52 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(); 
}