来自Word +创建XML文档 - >十六进制值0x0c的粘贴,是一个无效的字符(.net)

StackOverflow https://stackoverflow.com/questions/2874330

我有一个网页,可以接受用户的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:除9、10和13以外,所有字符均取代 String.Empty.

我正在寻找的是一种更好的方法。内置.NET方法?也许只是非法Unicode字符的完整列表。

有帮助吗?

解决方案

找到了有两个做同一件事的答案

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

第一个使用StringBuilder,通过字符逐一循环并滤除非法字符。第二个使用正则和替代来完成同一件事。两位作者都研究了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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top