1. ホーム
  2. c#

データを使用する 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();

}