从Word粘贴+创建XML文档 - >十六进制值0x0C,是无效字符(.Net)

时间:2010-05-20 13:51:34

标签: c# xml unicode control-characters

我有一个接受用户HTML输入的网页。使用System.Xml命名空间将输入转换为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来消除我发现令人反感的字符: 除了9,10和13之外,0到31之间的所有字符都替换为String.Empty

我正在寻找的是更好的方法。内置的.Net方法?或者只是一个非法的unicode字符的完整列表。

1 个答案:

答案 0 :(得分: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
  3. 第一个使用StringBuilder,逐个循环遍历字符并过滤掉非法字符。 第二个使用Regex和.Replace来完成同样的事情。 两位作者都查看了Xml标准,以找出哪些字符是非法的。

    我在一个长字符串上做了一些计时(1.8 MB文件运行1000次)和一个短字符串(“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