在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);
答案 0 :(得分:2)
它不是Unicode字符,而是无效字符(未正确编码)。
无法屏蔽XmlTextReader
与无效的XML 。你需要
根据UTF8,所有这些字符(“é”)都用 2或3字节(或更多)编码。您可以使用十六进制编辑器进行验证。
答案 1 :(得分:1)
你是什么意思"绊倒读者"?你的第一段代码应该没问题 - 如果XML真的在它声明的编码中(请查看XML声明)那么它应该是绝对正常的。
如果XML真的坏了,我建议在 XML解析之前执行某种过滤(例如,将XML加载到具有正确编码的字符串中,然后修复声明> em>编码匹配)...但我们需要首先解决它的错误。