質問

任意のエンコーディングで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);

多くのコードをリファクタリングする必要があるため、これは元のポスターを提供しないかもしれませんが、プロジェクトのために新しいコードを書かなければならない人や、リファクタリングに価値があると思う人には便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top