来自Word +创建XML文档 - >十六进制值0x0c的粘贴,是一个无效的字符(.net)
-
03-10-2019 - |
题
我有一个网页,可以接受用户的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字符的完整列表。
解决方案
找到了有两个做同一件事的答案
- http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-is-an-in-invalid-character/
- 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
不隶属于 StackOverflow