14

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

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

在调试模式下,我可以看到流氓角色(抱歉,我不确定它的正式名称?):

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

调试模式下的流氓角色

4

2 回答 2

28

在这里,您有一个使用以下命令清除 xml 无效字符的示例Regex

 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, "");   
 }   
于 2013-10-16T09:00:58.960 回答
4

在无效 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);
    }
}
于 2015-07-10T13:58:11.307 回答