4

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

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

  1. XmlReader.Create(new StreamReader(fileImport.FileContent, true));
  2. new XmlTextReader(fileImport.FileContent)

第一个是 XmlReader.Create,它使用 StreamReader 进行编码,效果很好。

第二个,新的 XmlTextReader,抛出一个 XmlException,并带有消息“给定编码中的无效字符”。

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

XmlTextReader[msdn] XmlTextReader.Encoding 属性

StreamReader[msdn] StreamReader 构造函数

那么,为什么 XmlTextReader 会失败,编码无效,而 StreamReader 却没有,当文档说默认情况下两种实现都以相同的方式处理编码时?

4

1 回答 1

5

它们的工作方式相同,但您使用它们的方式不同......在第一种情况下,您将 aStreamReader作为参数传递,而在第二种情况下,您将传递文件位置。

当您XmlReader在 a TextReader(如StreamReader)上创建一个时,它总是使用该的编码TextReader(忽略 XML 声明中的 encoding 属性的值)。当您只传递路径或流时,它使用 XML 声明中的 encoding 属性。

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

于 2012-09-08T00:47:11.493 回答