2011-06-13 58 views
2

我從最近使用的Web服務接收到一些文本時遇到了一些困難。 Web服務發回XML,這很好,但我們在某些XML中獲得了ASCII控制字符。我想在這篇文章中粘貼一個例子,但是無效的字符,我甚至無法將其粘貼到這個textarea。從Web服務輸出中清理ASCII控制字符

我花了一些時間研究在這些情況下要做什麼,我發現這篇內容豐富的文章:http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/。以下是與本文相關的報價:

這些不是具有任何 業務的XML字符的字符;他們應該 刪除 非法字符...

所以,下面的文章的意見,我已經寫了一些代碼,以從這項服務中的原始輸出和帶狀板的控制任何字符呢字符(而不是一個空格,製表符,CR或LF)

這裏是代碼:

System.Net.WebClient client = new System.Net.WebClient(); 

byte[] invalidCharacters = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xB, 
          0xC, 0xE, 0xF, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 
          0x17, 0x18, 0x1A, 0x1B, 0x1E, 0x1F, 0x7F }; 

byte[] sanitizedResponse = (from a in client.DownloadData(url) 
          where !invalidCharacters.Contains(a) 
          select a).ToArray(); 

result = System.Text.UTF8Encoding.UTF8.GetString(sanitizedResponse); 

這引起了我的思維,雖然。如果我收到雙字節字符,我會搞砸我收回的任何數據嗎?某些代碼頁是否有效,它包含由一個或兩個單字節ASCII控制字符組成的雙字節字符?這篇文章說這些字符在XML數據中沒有「沒有業務」的聲音聽起來最終,但我想要第二個意見。

欣賞任何反饋

回答

2

嗯,還有你的代碼是假設 UTF-8 - 這將不會有任何的字節在其數據(比那些字符以外),由於它的設計方式。不過,我會鼓勵文本驅動方法取代這種字節驅動方法 - 我可能會使用DownloadString代替DownloadData(並依靠WebClient選擇正確的編碼),但然後用正則表達式擦洗數據在解析它之前。

我倒是接觸網絡服務提供商來解釋他們投放的達夫XML ...

+0

由於這是無痛的! :) – omatase 2011-06-13 17:19:29

+0

如果您使用C#字符而不是字節,您還可以使用'Char.IsControl()'而不是硬編碼控制字符。 – 2011-06-13 17:50:21

+0

這是很好的建議,但我需要空間,標籤,回車等留下來。 – omatase 2011-06-13 18:28:05

0

嘗試以下操作:

byte[] byteArray = Encoding.ASCII.GetBytes(test); 
MemoryStream stream = new MemoryStream(byteArray);  
stream.Position = 0; 
StreamReader reader = new StreamReader(stream);    
string text = reader.ReadToEnd(); 
相關問題