我有一个 ACII 编码的 XML 文件。
我尝试使用两种不同的 Microsoft XmlReader 实现来阅读它:
XmlReader.Create(new StreamReader(fileImport.FileContent, true));
新的 XmlTextReader(fileImport.FileContent)
第一个 XmlReader.Create 使用 StreamReader 进行编码,效果很好。
第二个,新的 XmlTextReader,抛出一个 XmlException 和消息“给定编码中的无效字符”。
如果您阅读了这两者的 MSDN 文档,它们都应该从字节顺序标记检测编码,如果失败则回退到 UTF-8。
XmlTextReader
[msdn]
StreamReader
[msdn]
那么,为什么 XmlTextReader 会失败,编码无效,而 StreamReader 不会,当文档说这两种实现在默认情况下以相同方式处理编码时?
最佳答案
它们的工作方式相同,但您使用它们的方式不同...在第一种情况下,您将 StreamReader
作为参数传递,而在第二种情况下,您将传递文件位置。
当您在 TextReader
(例如 StreamReader
)上创建一个 XmlReader
时,它总是使用 TextReader< 的编码
(忽略 XML 声明中编码属性的值)。当您仅传递路径或流时,它会使用 XML 声明中的编码属性。
在您的情况下,我怀疑声明的编码与文件的实际编码不匹配。我能够通过创建一个声明其编码为 UTF-8 但实际上编码为 ANSI 的 XML 文件来重现您的问题。如果文件包含非 ASCII 字符,我会得到同样的错误。但是如果我修复 XML 声明中的编码,它就可以正常工作......
关于c# - 为什么 XmlReader 的默认编码与 XmlTextReader 的默认编码行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325856/