在将字符串加载到XML文档对象之前删除所有十六进制字符?

时间:2013-10-16 08:58:25

标签: c# .net xml character-encoding

我有一个xml字符串,它被发布到服务器上的ashx处理程序。 xml字符串构建在客户端,基于表单上的几个不同条目。有时,某些用户会从其他来源复制并粘贴到Web表单中。当我尝试使用XMLDocument将xml字符串加载到xmldoc.LoadXml(xmlStr)对象时,我得到以下异常:

System.Xml.XmlException = {"'', hexadecimal value 0x0B, is an invalid character. Line 2, position 1."}

在调试模式下,我可以看到流氓角色(抱歉,我不确定它的官方头衔?):

我的问题是在尝试将xml字符串加载到XMLDocument对象之前,如何清理xml字符串?我是否需要一个自定义函数来逐个解析所有这些字符,还是可以使用一些原生.NET4类来删除它们?

Rogue character in debug mode

2 个答案:

答案 0 :(得分:24)

这里有一个使用Regex清除xml无效字符的示例:

 xmlString = CleanInvalidXmlChars(xmlString);
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(xmlString);

 public static string CleanInvalidXmlChars(string text)   
 {   
   string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]";   
   return Regex.Replace(text, re, "");   
 }   

答案 1 :(得分:2)

更有效的方法是不对无效的XML字符进行错误输出,而是使用XmlReaderSettings中的CheckCharacters标志。

var xmlDoc = new XmlDocument();
var xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false };
using (var stringReader = new StringReader(xml)) {
    using (var xmlReader = XmlReader.Create(stringReader, xmlReaderSettings)) {
        xmlDoc.Load(xmlReader);
    }
}