【问题标题】:Paste from Word + Create XML document -> hexadecimal value 0x0C, is an invalid character (.Net)从 Word 粘贴 + 创建 XML 文档 -> 十六进制值 0x0C,是无效字符 (.Net)
【发布时间】:2011-02-21 21:24:51
【问题描述】:

我有一个接受用户 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 消除我发现令人反感的字符: 所有从 0 到 31 的字符,除了 9、10 和 13 都替换为 String.Empty

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

【问题讨论】:

    标签: c# xml unicode control-characters


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2016-11-14
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2016-01-07
      相关资源
      最近更新 更多