C#:从偶尔的Unicode字符中屏蔽XmlTextReader

时间:2011-05-03 10:57:21

标签: c# xml unicode stream

在C#中,我有一个直接从HTTP响应创建的XmlTextReader(我无法控制响应的XML内容)。

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
XmlTextReader reader = new XmlTextReader(response.GetResponseStream());

它有效,但有时一个XML元素节点将包含一个Unicode字符(例如“é”),它会使读者绊倒。我试图使用具有声明编码的StreamReader,但现在XmlTextReader在第一行退出:“数据无效。第1行,第1位”:

StreamReader sReader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Unicode);
XmlTextReader reader = new XmlTextReader(sReader);

有没有办法解决这个问题?或者,有没有办法阻止XmlTextReader使用可能有问题的字符解析一个元素(我知道它的名字)?我并不关心那个特定元素,我只是不想让它绊倒读者。

编辑:快速修复:将响应读入StringBuilder(“sb”):

sb.Replace("é", "e");
StringReader strReader = new StringReader(sb.ToString());
XmlTextReader reader = new XmlTextReader(strReader);

2 个答案:

答案 0 :(得分:2)

它不是Unicode字符,而是无效字符(未正确编码)。

无法屏蔽XmlTextReader无效的XML 。你需要

  • 修复服务器端以正确编码字符
  • 预处理文本以自行完成

根据UTF8,所有这些字符(“é”)都用 2或3字节(或更多)编码。您可以使用十六进制编辑器进行验证。

答案 1 :(得分:1)

你是什么意思"绊倒读者"?你的第一段代码应该没问题 - 如果XML真的在它声明的编码中(请查看XML声明)那么它应该是绝对正常的。

如果XML真的坏了,我建议在 XML解析之前执行某种过滤(例如,将XML加载到具有正确编码的字符串中,然后修复声明 em>编码匹配)...但我们需要首先解决它的错误。