【问题标题】:C#: shield XmlTextReader from an occasional Unicode characterC#:保护 XmlTextReader 免受偶尔的 Unicode 字符的影响
【发布时间】:2011-08-17 15:01:59
【问题描述】:

在 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);

【问题讨论】:

    标签: c# xml unicode stream


    【解决方案1】:

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

    无法保护XmlTextReader 免受无效 XML 的影响。你需要

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

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

    【讨论】:

      【解决方案2】:

      您所说的“让读者绊倒”是什么意思?您的第一个 sn-p 代码应该没问题 - 如果 XML 确实是它声明的编码(请查看 XML 声明),那么它应该是绝对没问题的。

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

      【讨论】:

      • 没有编码声明。 HTTP 响应中的第一行内容为:... 后跟元素节点。最后一行是。服务器返回 XML 格式的数据,这些数据可能不是 100% 完美的 XML。我无法控制它。看起来文本过滤是唯一的选择。
      • @MrSparkly:好的,它应该根据流检测编码。你知道实际上使用的是什么编码吗?在开头插入您自己的 XML 声明可能并不难。
      • 插入我自己的编码声明就像添加
        @MrSparkly:不,那是一个 HTML 标记...我的意思是 <?xml version="1.0" encoding="..." ?> 在开头的 <html> 标记之前。
      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 2012-12-20
      • 2018-07-24
      • 1970-01-01
      • 2016-05-14
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多