XmlException:给定编码中的字符无效

时间:2016-12-19 09:10:54

标签: c# .net xml-parsing

我有一个UTF-8编码的xml

<?xml version="1.0" encoding="UTF-8"?>

使用以下版本的xml阅读器时。我假设这使用UTF-8编码来解析xml文件。

 using (XmlReader reader = XmlReader.Create(inputUri))

我正处于异常之下。

System.Xml.XmlException occurred
  HResult=-2146232000
  LineNumber=18750
  LinePosition=13
  Message=Invalid character in the given encoding. Line 18750, position 13.

但是在使用xmlreader的以下版本时

using (XmlReader reader = XmlReader.Create(new StreamReader(inputUri,Encoding.UTF8)))

成功解析xml。为什么这两个版本之间的这些差异都使用相同的编码来解析给定的xml文件?

PS:我非常确定第一个版本使用UTF-8编码。

以下是 XmlTextReaderImpl.cs 的摘录,其实例由第一个版本返回。

        private void SetupEncoding( Encoding encoding ) {
            if ( encoding == null ) {
                Debug.Assert( ps.charPos == 0 );
                ps.encoding = Encoding.UTF8;
                ps.decoder = new SafeAsciiDecoder(); // This falls back to UTF-8 decoder
            }
}

2 个答案:

答案 0 :(得分:1)

我在msdn forum得到了答案。

“XmlReader会将任何非法字符标记为非法,因为XML格式已损坏。

在第二种情况下,由于StreamReader是通用文本阅读器,当遇到不在编码范围内的数据时,它会用replacement fallback替换该字符。因此,当您将结果流传递给XmlReader时,它现在可以看到的所有字符都落在由编码定义的合法范围内。“

答案 1 :(得分:0)

using (XmlReader reader = XmlReader.Create(inputUri))

以上将使用XmlReader的编码,并将忽略文件的编码声明。

这就是出现异常的原因,也就是第二种方法有效的原因 - 因为您提供了UTF-8编码来使用。

N.B。我认为默认编码是UTF-16