1. ホーム
  2. c#

[解決済み] C# で無効な XML 文字をエスケープする

2023-03-05 10:53:56

質問

無効なXML文字が含まれる文字列があります。文字列を解析する前に、無効なXML文字をエスケープ(除去)するにはどうしたらよいでしょうか。

どのように解決するのですか?

無効なXML文字を削除する方法として、私はあなたが使用することをお勧めします。 XmlConvert.IsXmlChar メソッドを使用することをお勧めします。これは、.NET Framework 4以降に追加されたもので、Silverlightでも提供されています。以下は小さなサンプルです。

void Main() {
    string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    content = RemoveInvalidXmlChars(content);
    Console.WriteLine(IsValidXmlString(content)); // True
}

static string RemoveInvalidXmlChars(string text) {
    var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
    return new string(validXmlChars);
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

また、無効なXML文字をエスケープする方法として、私は以下の方法を提案します。 XmlConvert.EncodeName メソッドを使用することをお勧めします。 以下は小さなサンプルです。

void Main() {
    const string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    string encoded = XmlConvert.EncodeName(content);
    Console.WriteLine(IsValidXmlString(encoded)); // True

    string decoded = XmlConvert.DecodeName(encoded);
    Console.WriteLine(content == decoded); // True
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

更新しました。 エンコード処理では、ソース文字列の長さ以上の長さの文字列が生成されることに言及しておく必要があります。これは、エンコードされた文字列をデータベース内の長さ制限のある文字列カラムに格納し、データカラムの制限に合うようにアプリ内でソース文字列の長さを検証する場合に重要になる場合があります。