3

我有一个接受用户 HTML 输入的网页。使用命名空间将输入转换为 xml 文档System.Xml,如下所示:

var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.SetAttribute("BodyHTML", theTextBox.Text);

然后对数据使用 Xsl 转换 ( System.Xml.Xsl.XslCompiledTransform)。

用户倾向于使用项目符号、引号等在 Microsoft Word 中编写文本。粘贴到我的页面时,他们的文本包含无效字符,例如 0x0C、0x03 等。使用xsl转换时,出现此错误“十六进制值0x0C,是无效字符”。

到目前为止,我的解决方法是消除我发现令人反感的字符,使用循环和String.Replace:从 0 到 31 的所有字符,除了 9、10 和 13 都替换为String.Empty.

我正在寻找的是一种更好的方法来做到这一点。内置的 .Net 方法?或者可能只是非法 Unicode 字符的完整列表。

4

1 回答 1

9

找到两个做同样事情的答案

  1. http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. http://www.theplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-character

第一个使用 StringBuilder,逐个循环字符并过滤掉非法字符。第二个使用 Regex 和 .Replace 来完成同样的事情。两位作者都查看了 Xml 标准以找出哪些字符是非法的。

我对一个长字符串(1.8 MB 文件运行 1,000 次)和一个短字符串(“Hello world”运行 10,000,000 次)做了一些计时。StringBuilder 方法比正则表达式快约 3 倍。与我链接的代码不同,正则表达式当然只编译一次。

长字符串:

CleanInvalidXmlChars time: 00:00:07.4356230
SanitizeXmlString    time: 00:00:02.3703305

短字符串:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
于 2010-05-20T15:06:26.980 回答