データを使用する XmlReader または XPathDocument を構築する前に、XML ベースのデータ ソースから無効な 16 進文字を削除するにはどうすればよいですか?
2023-08-27 01:47:32
質問
XmlReader で使用する前に、XML ベースのデータ ソースをクリーンにして、XML に設定されている 16 進文字の制限に準拠しない XML データを優雅に消費できるような、簡単で一般的な方法はありますか?
注意してください。
- このソリューションでは、XML データソースを処理する必要があります。 を使用する XML データソースを処理する必要があります。 で文字エンコーディングを指定する。 XML ドキュメント宣言で指定する必要がある。ただし ソースの文字エンコーディングを変更しない ソースの文字エンコーディングを崩さず,無効な 16進数文字を除去しながら、ソースの文字エンコーディングを混乱させないことが 大きな難点でした。
- 無効な 16 進文字の削除は、16 進エンコードされた値のみを削除すべきです。なぜなら、16 進文字と一致する文字列を偶然含むデータで href 値を見つけることがよくあるからです。
背景
特定の形式に準拠した XML ベースのデータソース (Atom または RSS フィードを考えてください) を消費する必要がありますが、XML 仕様に従って無効な 16 進文字を含む発行済みのデータソースを消費できるようにしたいのです。
.NET では、XML データ ソースを表すストリームがあり、XmlReader や XPathDocument を使用してそれを解析しようとすると、XML データに無効な 16 進文字が含まれているため、例外が発生します。この問題を解決するための私の現在の試みは、ストリームを文字列として解析し、正規表現を使用して無効な 16 進文字を削除または置換することですが、よりパフォーマンスの高い解決策を探しています。
どのように解決するのですか?
それは 完璧ではないかもしれませんが (この免責事項を見逃す人がいるので強調)、その場合に私が行ったことは以下の通りです。ストリームで使用するように調整することができます。
/// <summary>
/// Removes control characters and other non-UTF-8 characters
/// </summary>
/// <param name="inString">The string to process</param>
/// <returns>A string with no control characters or entities above 0x00FD</returns>
public static string RemoveTroublesomeCharacters(string inString)
{
if (inString == null) return null;
StringBuilder newString = new StringBuilder();
char ch;
for (int i = 0; i < inString.Length; i++)
{
ch = inString[i];
// remove any characters outside the valid UTF-8 range as well as all control characters
// except tabs and new lines
//if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
//if using .NET version prior to 4, use above logic
if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4
{
newString.Append(ch);
}
}
return newString.ToString();
}
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C# で無効な XML 文字をエスケープする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。