0

XMLの読み取りで問題が発生しました。解決策は見つかりましたが、まだいくつかの質問があります。不正なXMLファイルはUTF-8でエンコードされており、ヘッダーに適切なマークが付いています。ただし、UTF-16でエンコードされた文字も含まれています-'é'。このコードは、コンテンツを検証するためにXMLファイルを読み取るために使用されました。

var xDoc = XDocument.Load(taxFile);

指定された誤ったXMLファイルに対して例外が発生します:「指定されたエンコーディングの無効な文字。59行目、104行目」。簡単な修正は次のとおりです。

XDocument xDoc = null;
using (var oReader = new StreamReader(taxFile, Encoding.UTF8))
{
    xDoc = XDocument.Load(oReader);
}

このコードは、誤ったファイルに対して例外を発生させません。ただし、「é」文字は�としてロードされます。私の最初の質問は「なぜそれが機能するのか」です。

もう1つのポイントは、XmlReaderを使用しても、「é」が付いたノードがロードされるまで例外が発生しないことです。

XmlReader xmlTax = XmlReader.Create(filePath);

また、StreamReaderを使用したトレーニングが役立ちます。同じ質問。修正ソリューションが十分ではないようです。ある日原因となります:)別の形式でエンコードされたXMLが表示され、間違った方法で処理される可能性があります。しかし、UTF-16形式のXMLファイルを処理しようとしましたが、正常に機能しました(UTF-8に構成されています)。

最後の質問は、XDocument/XmlReaderがこのような文字エンコードまたはsmthを無視するために提供されるオプションがあるかどうかです。

返信をお待ちしております。前もって感謝します

4

1 に答える 1

4

最初に注意することは、XMLファイルに実際に欠陥があることです。このように同じファイルにテキストエンコーディングを混在させることは行わないでください。ファイルに明示的なエンコーディングが実際に埋め込まれている場合、エラーはさらに明白になります。

StreamReaderで例外なく読み取ることができる理由は、互換性のないデータが発生したときに何が起こるかを制御する設定がエンコーディングに含まれているためです。

Encoding.UTF8は、フォールバック文字を使用するように文書化されています。http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8.aspxから:

このプロパティによって返されるUTF8Encodingオブジェクトは、アプリケーションに対して適切な動作をしない可能性があります。置換フォールバックを使用して、エンコードできない各文字列とデコードできない各バイトを疑問符( "?")文字で置き換えます。

エンコーディングを自分でインスタンス化して、さまざまな設定を取得できます。これはおそらくXDocument.Load()が行うことです。これは、デフォルトでエラーを非表示にするのは一般的に悪いためです。 http://msdn.microsoft.com/en-us/library/system.text.utf8encoding.aspx

そのような壊れたXMLファイルが送信されている場合、ステップ1はそれについて(大声で)文句を言うことです。そのような振る舞いの正当な理由はありません。とにかく絶対にそれらを処理する必要がある場合は、UTF8EncodingクラスとそのDecoderFallbackPropertyを確認することをお勧めします。カスタムのDecoderFallbackとDecoderFallbackBufferを実装して、UTF-16バイトシーケンスを理解するロジックを追加できるはずです。

于 2013-01-11T15:45:08.830 に答える