web-dev-qa-db-ja.com

XmlReaderの文字エンコーディングを変更する方法

私は単純なXmlReaderを持っています:

XmlReader r = XmlReader.Create(fileName);

while (r.Read())
{
    Console.WriteLine(r.Value);
}

問題は、XmlファイルにISO-8859-9文字が含まれているため、XmlReaderが "Invalid character in the given encoding."例外をスローすることです。最初に<?xml version="1.0" encoding="ISO-8859-9" ?>行を追加することでこの問題を解決できますが、ソースファイルを変更できない場合に備えて別の方法で解決したいと思います。 XmlReaderのエンコーディングを変更するにはどうすればよいですか?

22
dstr

.NETにISO-8859-9としてファイルを読み込ませるには、多くのXmlReader.Createオーバーロードの1つを使用します。

using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding("ISO-8859-9")))) {
    while(r.Read()) {
        Console.WriteLine(r.Value);
    }
}

ただし、IIRC、W3C XML標準は、XML宣言行が読み取られたときに何かを示すので、機能しない可能性があります。準拠パーサーは、以前使用していたエンコーディングに関係なく、XML宣言で指定されたエンコーディングにすぐに切り替える必要があります。あなたのケースでは、XMLファイルにXML宣言がない場合、エンコーディングはUTF-8であり、それでも失敗します。ここではナンセンスな話をしているかもしれませんので、実際に試してみてください。 :-)

35

XmlTextReaderクラス(Createは抽象基本クラスであるため、静的XmlReaderメソッドが実際に返すもの)は、XMLファイル自体からのエンコーディングを自動的に検出するように設計されています-手動で設定する方法はありません。

読み取るファイルに次のXML宣言が含まれていることを確認してください。

<?xml version="1.0" encoding="ISO-8859-9"?>
4
Noldorin

入力ファイルのヘッダーが正しいことを確認できない場合は、XmlReader.Createメソッドに対する他の11のオーバーロードの1つを確認できます。

これらのいくつかは、XmlReaderSettings変数またはXmlParserContext変数、あるいはその両方を取ります。私はこれらを調査していませんが、適切な値を設定すると、ここで役立つ可能性があります。

XmlReaderSettings.CheckCharactersプロパティがあります-この状態のヘルプ:

文字をチェックし、有効なXML文字の範囲外の文字がある場合は例外をスローするようにリーダーに指示します。文字チェックには、ドキュメント内の無効な文字のチェック、およびXML名の有効性のチェックが含まれます(たとえば、XML名が数字で始まっていない場合があります)。

したがって、これをfalseに設定すると役立つ場合があります。ただし、ヘルプには次のようにも記載されています。

XmlReaderがテキストデータを処理している場合、プロパティの設定に関係なく、XML名とテキストコンテンツが有効であることを常に確認します。 CheckCharactersをfalseに設定すると、文字エンティティ参照の文字チェックがオフになります。

したがって、さらなる調査が必要です。

2
ChrisF

XmlTextReaderの代わりにXmlReaderを使用:

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))
0
Math