为了加载任意编码的XML文件,我有以下代码:
Encoding encoding;
using (var reader = new XmlTextReader(filepath))
{
reader.MoveToContent();
encoding = reader.Encoding;
}
var settings = new XmlReaderSettings { NameTable = new NameTable() };
var xmlns = new XmlNamespaceManager(settings.NameTable);
var context = new XmlParserContext(null, xmlns, "", XmlSpace.Default,
encoding);
using (var reader = XmlReader.Create(filepath, settings, context))
{
return XElement.Load(reader);
}
这样做是可行的,但打开文件两次似乎有点低效。是否有更好的方法可以检测编码,以便我可以执行以下操作:
- 打开文件
- 检测编码
- 将XML读入XElement中
- 关闭文件
XElement.Load(XmlReader.Create(new FileStream(filepath, FileMode.Open)))
应该做同样的事情(为了简洁起见省略了资源处理)。XmlReader.Create(Stream) 的文档说:XmlReader 扫描流的前几个字节,寻找字节顺序标记或其他编码标志。当确定编码时,就使用该编码继续读取流,并且处理将继续将输入解析为(Unicode)字符流。 我想知道您是否明确指定了编码类型。 - petr k.XmlReader
无法工作,我必须通过解析器上下文明确指定编码才能使它工作。我应该在这里记录更多我的情境,因为现在我无法记住所有的细节 :) - Peter Lillevold