为什么XmlReader上的默认编码与XmlTextReader的默认编码不同?

时间:2012-09-07 21:50:52

标签: c# xml character-encoding

我有一个ACII编码的XML文件。

我尝试使用两种不同的Microsoft XmlReader实现来阅读它:

  1. XmlReader.Create(new StreamReader(fileImport.FileContent, true));
  2. new XmlTextReader(fileImport.FileContent)
  3. 第一个,XmlReader.Create,它使用StreamReader进行编码,效果很好。

    第二个,新的XmlTextReader,在给定的编码中抛出一个带有Message' Invalid字符的XmlException。'

    如果你阅读了这两个文件的MSDN文档,他们都应该从字节顺序标记中检测编码,如果失败则回退到UTF-8。

    XmlTextReader [msdn] XmlTextReader.Encoding property

    StreamReader [msdn] StreamReader constructor

    那么,为什么XmlTextReader失败,编码无效,而StreamReader没有,当文档说两个实现默认情况下处理相同的编码?

1 个答案:

答案 0 :(得分:5)

它们以相同的方式工作,但你没有以相同的方式使用它们......在第一种情况下,你传递StreamReader作为参数,而在第二种情况下你传递文件位置。

XmlReader(例如TextReader)上创建StreamReader时,它始终使用TextReader的编码(忽略编码属性的值) XML声明)。当您只传递路径或流时,它使用XML声明中的encoding属性。

在您的情况下,我怀疑声明的编码与文件的实际编码不匹配。我能够通过创建一个声明其编码为UTF-8的XML文件来重现您的问题,但实际上编码为ANSI。如果文件包含非ASCII字符,我会得到相同的错误。但是,如果我在XML声明中修复编码,它可以正常工作......