推奨されるSystem.Security.SecureElement.Escape()メソッドは、ユニバーサルWindowsプラットフォームアプリケーションでは使用できないようです。ユニバーサルWindowsプラットフォームアプリケーションのXMLに特殊文字をエンコードする
文字列(Wet Paint & Co
など)をXML形式(Wet Paint & Co
)に変換するには、どのような方法が推奨されますか?
推奨されるSystem.Security.SecureElement.Escape()メソッドは、ユニバーサルWindowsプラットフォームアプリケーションでは使用できないようです。ユニバーサルWindowsプラットフォームアプリケーションのXMLに特殊文字をエンコードする
文字列(Wet Paint & Co
など)をXML形式(Wet Paint & Co
)に変換するには、どのような方法が推奨されますか?
remarks in the MSDNを見ると、SecurityElement.Escape
からエスケープされるすべての文字を含む表が見つかります。最も簡単な方法は、あなた自身の方法でこれらの文字を置き換えることになります。
public static string Escape(string str){
return str.Replace("&", "&")
.Replace(">", ">")
.Replace("\"", """)
.Replace("\'", "'")
.Replace("<", "<");
}
しかし、それぞれのReplace
は、新しい文字列インスタンスを作成しますので、これはかなり遅いです。大きな文字列の場合は、文字列を繰り返し処理して文字をStringBuilder
に追加する方が良いでしょう。しかし
public static string Escape(string str)
{
var sb = new StringBuilder();
foreach (var chr in str)
{
switch (chr)
{
case '&':
sb.Append("&");
break;
case '<':
sb.Append("<");
break;
case '>':
sb.Append(">");
break;
case '"':
sb.Append(""");
break;
case '\'':
sb.Append("'");
break;
default:
sb.Append(chr);
break;
}
}
return sb.ToString();
}
私はあなたがStringBuilder
ので、あなたが私のReplace
方法を変更し、それにあなたのStringBuilder
を渡すことができて、あなたのXMLを構築することをお読みください。したがって、2番目のインスタンスを作成する必要はありません。
しかし、多くの場合、XElement
などのクラスがあなたのために行うので、自分で文字列をエンコードする必要はありません。他の人があなたの質問のコメントで言ったように、LinQ to XML(XElement
、...)やXMLシリアル化を使用してXMLを生成する方が簡単だと思います。
完璧のため
誰がお勧めしますか?エスケープ文字を生成するメソッドは必要ありません。実際にXMLテキストを生成したときに、特殊文字がエスケープされているはずです。どのようにしてXMLテキストを生成しましたか? XmlElement.InnerTextとXElementコンストラクタの両方が指定されたテキストをエスケープします –
現在のコードではStringBuilder(バイナリ形式に切り替える可能性が高いため柔軟性があります)が使用されますが、代わりにXElementを使用するように切り替えることを検討しています。この問題は2か所で発生するため、SecureElement.Escape()は理想的です。 –
@stuartdこのページを見ましたが、これはUWPのため、SecureElement.Escape()を含むいくつかのオプションは利用できません(UrlEncodeはスペースの代わりに%20と%26を追加し、&)。 –