2010-05-20 34 views
3

我有一個網頁接受來自用戶的HTML輸入。輸入是使用命名空間System.Xml轉換成XML文檔,例如:從Word粘貼+創建XML文檔 - >十六進制值0x0C,是一個無效字符(.Net)

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字符的完整列表。

回答

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文件運行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 
相關問題