8

任意のエンコーディングで 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. ファイルを開く
  2. エンコーディングを検出する
  3. XML を XElement に読み込む
  4. ファイルを閉じる
4

2 に答える 2

9

わかりました、私はこれをもっと早く考えるべきでした。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 つのファイルを開くだけで済みます。

于 2009-03-12T10:32:23.893 に答える
0

もう 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);

大量のコードをリファクタリングする必要があるため、元の投稿者には役立たないかもしれませんが、プロジェクト用に新しいコードを書かなければならない人や、リファクタリングに価値があると考える人にとっては便利です。

于 2016-04-16T01:17:50.833 に答える