2

入力として Stream が与えられた場合、XML データ ソースに対して XPathNavigator を安全に作成するにはどうすればよいですか?

XML データ ソース:

  • 削除する必要がある無効な 16 進数文字が含まれている可能性があります。
  • ドキュメントの宣言されたエンコーディングと一致しない文字が含まれている可能性があります。

例として、クラウド内の一部の XML データ ソースではutf-8のエンコードが宣言されていますが、実際のエンコードはwindows-1252またはISO 8859-1であり、これに対して XmlReader を作成するときに無効な文字の例外がスローされる可能性があります。ストリーム。

StreamReader.CurrentEncodingプロパティのドキュメントから: 「現在のリーダーで使用されている現在の文字エンコーディング。値は、StreamReader の任意の Read メソッドへの最初の呼び出しの後で異なる場合があります。これは、エンコーディングの自動検出が Read メソッドへの最初の呼び出しまで行われないためです。 " これは、最初の読み取り後に CurrentEncoding を確認できることを示しているようですが、XML データを Stream に書き出す必要があるときに、このエンコーディングを格納するのに行き詰っていますか?

無効な文字の問題のエンコードを (できれば C# で) 適切に処理する XML データ ソースに対して XPathNavigator/IXPathNavigable インスタンスを安全に作成するためのベスト プラクティスを見つけたいと思っています。

4

3 に答える 3

2

一部の XML フラグメントが間違ったエンコーディングを使用して CRM システムにインポートされたときに、同様の問題が発生しました (XML フラグメントと一緒に保存されたエンコーディングはありませんでした)。

ループで、リストから現在のエンコーディングを使用してラッパー ストリームを作成しました。エンコーディングは、DecoderExceptionFallback および EncoderExceptionFallback オプションを使用して構築されました (@Doug が言及)。処理中に DecoderFallbackException がスローされた場合、元のストリームがリセットされ、次に可能性の高いエンコーディングが使用されます。

私たちのエンコーディング リストは、UTF-8、Windows-1252、GB-2312、US-ASCII のようなものでした。リストの最後から外れた場合、ストリームは非常に悪く、拒否/無視/その他されました。

編集:

簡単なサンプルと基本的なテスト ファイルを作成しました (ソースはこちら)。このコードには、両方とも同じバイト セットに一致するコード ページから選択するヒューリスティックがないため、Windows-1252 ファイルは GB2312 として検出される場合があり、ファイルの内容やエンコーディングの優先順序によっては、GB2312 として検出される場合もあります。

于 2009-01-28T04:53:54.410 に答える
1

DecoderFallbackクラス (およびいくつかの関連クラス) を使用して、それらをスキップするか、何か他のことを行う (新しいエンコーディングで再起動しますか?) ことによって、悪い文字に対処することができます。

于 2009-01-28T03:12:47.110 に答える
0

XmlTextReader などを使用する場合、リーダー自体が xml ファイルで宣言されているエンコーディングを判断します。

于 2008-10-31T23:03:44.630 に答える