如何最好地检测XML文件的编码?
-
10-07-2019 - |
题
要加载具有任意的编码的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
解决方案
好吧,我应该已经想到了这点。两者的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文件应该更优雅,但至少我越来越远,只有一个文件打开。
其他提示
另一种选择,很简单,是使用LINQ到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);
虽然这可能不是服务器的原始海报,因为他将不得不重构大量的代码,这是谁的人有编写新的代码为他们的项目,或者如果他们认为重构是值得的,有益的。
不隶属于 StackOverflow