我有一个ACII编码的XML文件。
我尝试使用两种不同的Microsoft XmlReader实现来阅读它:
XmlReader.Create(new StreamReader(fileImport.FileContent, true));
new XmlTextReader(fileImport.FileContent)
第一个,XmlReader.Create,它使用StreamReader进行编码,效果很好。
第二个,新的XmlTextReader,在给定的编码中抛出一个带有Message' Invalid字符的XmlException。'
如果你阅读了这两个文件的MSDN文档,他们都应该从字节顺序标记中检测编码,如果失败则回退到UTF-8。
XmlTextReader
[msdn]
StreamReader
[msdn]
那么,为什么XmlTextReader失败,编码无效,而StreamReader没有,当文档说两个实现默认情况下处理相同的编码?
答案 0 :(得分:5)
它们以相同的方式工作,但你没有以相同的方式使用它们......在第一种情况下,你传递StreamReader
作为参数,而在第二种情况下你传递文件位置。
在XmlReader
(例如TextReader
)上创建StreamReader
时,它始终使用TextReader
的编码(忽略编码属性的值) XML声明)。当您只传递路径或流时,它使用XML声明中的encoding属性。
在您的情况下,我怀疑声明的编码与文件的实际编码不匹配。我能够通过创建一个声明其编码为UTF-8的XML文件来重现您的问题,但实际上编码为ANSI。如果文件包含非ASCII字符,我会得到相同的错误。但是,如果我在XML声明中修复编码,它可以正常工作......