Xml 要素または属性で使用する文字列をエンコードするための .Net のジェネリック メソッドを探していましたが、すぐに見つからなかったので驚きました。では、先に進む前に、組み込み関数が不足している可能性はありますか?
本当に存在しないと仮定して、独自のジェネリックEncodeForXml(string data)
メソッドを作成し、これを行うための最善の方法を考えています。
この全体を促した私が使用しているデータには、&、<、" などの不適切な文字が含まれている可能性があります。また、適切にエスケープされたエンティティ &、<、および " が含まれている場合もあります。 CDATA セクションは最良のアイデアではないかもしれません.それはちょっと不格好に思えます.xml で直接使用できる素敵な文字列値で終わるほうがずっとましです.
過去に正規表現を使用して悪いアンパサンドをキャッチしたことがありますが、この場合と最初のステップで正規表現を使用してキャッチし、他の文字を単純に置き換えることを考えています。
それで、これを複雑にしすぎずにさらに最適化することはできますか?私が見逃しているものはありますか? :
Function EncodeForXml(ByVal data As String) As String
Static badAmpersand As new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)")
data = badAmpersand.Replace(data, "&")
return data.Replace("<", "<").Replace("""", """).Replace(">", "gt;")
End Function
C# のみの皆さん、申し訳ありませんが、どの言語を使用するかはあまり気にしませんが、Regex を静的にしたかったのですが、C# ではメソッドの外で宣言しないとそれを行うことができないため、これは VB になります。 。ネット
最後に、私はまだ私が働いている .Net 2.0 を使用していますが、誰かが最終製品を取得して、それを文字列クラスの拡張メソッドに変えることができれば、それもかなりクールです。
更新最初のいくつかの応答は、.Net には実際にこれを行う組み込みの方法があることを示しています。しかし、私が始めたので、EncodeForXml() メソッドを楽しみのために終わらせたいと思っているので、まだ改善のアイデアを探しています。特に: エンティティとしてエンコードする必要がある文字のより完全なリスト (おそらくリスト/マップに格納される) と、不変の文字列に対してシリアルで .Replace() を実行するよりも優れたパフォーマンスが得られるもの。