Хорошо, я должен был подумать об этом раньше. И XmlTextReader (который дает нам кодировку), и XmlReader.Create (который позволяет нам указать кодировку) принимают поток. Итак, как насчет того, чтобы сначала открыть FileStream, а затем использовать его вместе с XmlTextReader и XmlReader, например:
using (var txtreader = new FileStream(filepath, FileMode.Open))
{
using (var xmlreader = new XmlTextReader(txtreader))
{
// Read in the encoding info
xmlreader.MoveToContent();
var encoding = xmlreader.Encoding;
// Rewind to the beginning
txtreader.Seek(0, SeekOrigin.Begin);
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(txtreader, settings, context))
{
return XElement.Load(reader);
}
}
}
Это работает как шарм. Чтение файлов XML независимым от кодировки способом должно быть более элегантным, но, по крайней мере, я открываю только один открытый файл.