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);
}
これは機能しますが、ファイルを2回開くのは少し効率が悪いようです。私ができるようにエンコーディングを検出するより良い方法はありますか:
1. Open file
2. Detect encoding
3. Read XML into an XElement
4. Close file
解決
はい、私はこれについて以前に考えるべきでした。 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つのファイルしか開いていません。
他のヒント
もう1つの簡単なオプションは、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);
多くのコードをリファクタリングする必要があるため、これは元のポスターを提供しないかもしれませんが、プロジェクトのために新しいコードを書かなければならない人や、リファクタリングに価値があると思う人には便利です。
所属していません StackOverflow