2

我从最近使用的 Web 服务收到的一些文本遇到了一些困难。Web 服务发回 XML,这很好,但是我们在一些 XML 的中间得到了 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 数据中“没有业务”听起来是最后的,但我想要第二个意见。

感谢任何反馈

4

2 回答 2

2

好吧,您显示的代码假设为UTF-8 - 由于它的设计方式,它的数据中永远不会包含任何这些字节(除了那些字符)。但是,我鼓励使用文本驱动的方法而不是这种字节驱动的方法——我可能会使用DownloadString而不是DownloadData(并且依赖于WebClient选择正确的编码),然后在解析数据之前使用正则表达式清理数据。

还会联系网络服务提供商解释他们正在提供 duff XML ......

于 2011-06-13T16:52:59.767 回答
0

尝试以下操作:

byte[] byteArray = Encoding.ASCII.GetBytes( test ); 
MemoryStream stream = new MemoryStream( byteArray );    
stream.Position = 0;
StreamReader reader = new StreamReader( stream );            
string text = reader.ReadToEnd(); 
于 2011-07-01T21:08:50.647 回答