为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?
Posted
技术标签:
【中文标题】为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?【英文标题】:Why Does The Default Encoding on XmlReader Behave Differently From XmlTextReader's Default Encoding?为什么 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同? 【发布时间】:2012-09-01 19:04:33 【问题描述】:我有一个 ACII 编码的 XML 文件。
我尝试使用两种不同的 Microsoft XmlReader 实现来阅读它:
XmlReader.Create(new StreamReader(fileImport.FileContent, true));
new XmlTextReader(fileImport.FileContent)
第一个 XmlReader.Create 使用 StreamReader 进行编码,效果很好。
第二个,new XmlTextReader,抛出一个 XmlException 并带有消息“给定编码中的无效字符”。
如果您阅读了这两个的 MSDN 文档,它们都应该从字节顺序标记中检测编码,如果检测失败,则回退到 UTF-8。
XmlTextReader
[msdn]
StreamReader
[msdn]
那么,为什么 XmlTextReader 会失败,编码无效,而 StreamReader 却没有,当文档说默认情况下两种实现都以相同的方式处理编码时?
【问题讨论】:
【参考方案1】:它们的工作方式相同,但您使用它们的方式不同...在第一种情况下,您将 StreamReader
作为参数传递,而在第二种情况下,您将传递文件位置。
当您在TextReader
(例如StreamReader
)上创建XmlReader
时,它始终使用TextReader
的编码(忽略XML 声明中编码属性的值)。当您只传递路径或流时,它使用 XML 声明中的 encoding 属性。
在您的情况下,我怀疑声明的编码与文件的实际编码不匹配。我能够通过创建一个 XML 文件来重现您的问题,该文件将其编码声明为 UTF-8,但实际上编码为 ANSI。如果文件包含非 ASCII 字符,我会得到同样的错误。但是,如果我修复 XML 声明中的编码,它就可以正常工作...
【讨论】:
感谢托马斯的回复。对声明的编码有很好的思考。星期一回到办公室时,我会仔细检查一下。 嗯...根节点上没有定义编码属性。我不确定 XmlTextReader 正在做什么来确定编码,但我将使用 StreamReader 实现运行。如果它再次破裂,可能会更明显问题是什么。谢谢。以上是关于为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?的主要内容,如果未能解决你的问题,请参考以下文章