要使用任意编码加载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);
}
这样可行,但打开文件两次似乎有点低效。有没有更好的方法来检测编码,我可以这样做:
1. Open file
2. Detect encoding
3. Read XML into an XElement
4. Close file
答案 0 :(得分:8)
好的,我应该早点想到这个。 XmlTextReader(它给我们编码)和XmlReader.Create(允许我们指定编码)都接受一个Stream。那么首先打开一个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文件本来应该更优雅,但至少我只打开了一个文件。
答案 1 :(得分:0)
另一个很简单的选择是使用Linq to XML。 Load方法自动从xml文件中读取编码。然后,您可以使用XDeclaration.Encoding属性获取编码器值。 来自MSDN的一个例子:
// Create the document
XDocument encodedDoc16 = new XDocument(
new XDeclaration("1.0", "utf-16", "yes"),
new XElement("Root", "Content")
);
encodedDoc16.Save("EncodedUtf16.xml");
Console.WriteLine("Encoding is:{0}", encodedDoc16.Declaration.Encoding);
Console.WriteLine();
// Read the document
XDocument newDoc16 = XDocument.Load("EncodedUtf16.xml");
Console.WriteLine("Encoded document:");
Console.WriteLine(File.ReadAllText("EncodedUtf16.xml"));
Console.WriteLine();
Console.WriteLine("Encoding of loaded document is:{0}", newDoc16.Declaration.Encoding);
虽然这可能无法为原始海报服务,因为他必须重构大量代码,但对于必须为其项目编写新代码的人,或者他们认为重构是值得的,这是有用的。