我有一个包含无效XML字符的字符串。在解析字符串之前,如何转义(或删除)无效的XML字符?
作为删除无效XML字符的方法,建议您使用XmlConvert.IsXmlChar方法。它是从.NET Framework 4开始添加的,并且也在Silverlight中提供。这是小样本:
void Main() { string content = "\v\f\0"; Console.WriteLine(IsValidXmlString(content)); // False content = RemoveInvalidXmlChars(content); Console.WriteLine(IsValidXmlString(content)); // True } static string RemoveInvalidXmlChars(string text) { var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray(); return new string(validXmlChars); } static bool IsValidXmlString(string text) { try { XmlConvert.VerifyXmlChars(text); return true; } catch { return false; } }
作为逃脱无效XML字符的方法,我建议您使用XmlConvert.EncodeName方法。这是小样本:
void Main() { const string content = "\v\f\0"; Console.WriteLine(IsValidXmlString(content)); // False string encoded = XmlConvert.EncodeName(content); Console.WriteLine(IsValidXmlString(encoded)); // True string decoded = XmlConvert.DecodeName(encoded); Console.WriteLine(content == decoded); // True } static bool IsValidXmlString(string text) { try { XmlConvert.VerifyXmlChars(text); return true; } catch { return false; } }
更新: 应该提到的是,编码操作产生的字符串的长度大于或等于源字符串的长度。当您将编码后的字符串存储在具有长度限制的字符串列中的数据库中,并验证应用程序中的源字符串长度以适合数据列限制时,这可能很重要。