2016-08-12 8 views
0

推奨されるSystem.Security.SecureElement.Escape()メソッドは、ユニバーサルWindowsプラットフォームアプリケーションでは使用できないようです。ユニバーサルWindowsプラットフォームアプリケーションのXMLに特殊文字をエンコードする

文字列(Wet Paint & Coなど)をXML形式(Wet Paint & Co)に変換するには、どのような方法が推奨されますか?

+0

誰がお勧めしますか?エスケープ文字を生成するメソッドは必要ありません。実際にXMLテキストを生成したときに、特殊文字がエスケープされているはずです。どのようにしてXMLテキストを生成しましたか? XmlElement.InnerTextとXElementコンストラクタの両方が指定されたテキストをエスケープします –

+0

現在のコードではStringBuilder(バイナリ形式に切り替える可能性が高いため柔軟性があります)が使用されますが、代わりにXElementを使用するように切り替えることを検討しています。この問題は2か所で発生するため、SecureElement.Escape()は理想的です。 –

+0

@stuartdこのページを見ましたが、これはUWPのため、SecureElement.Escape()を含むいくつかのオプションは利用できません(UrlEncodeはスペースの代わりに%20と%26を追加し、&)。 –

答えて

1

remarks in the MSDNを見ると、SecurityElement.Escapeからエスケープされるすべての文字を含む表が見つかります。最も簡単な方法は、あなた自身の方法でこれらの文字を置き換えることになります。

public static string Escape(string str){ 
    return str.Replace("&", "&") 
       .Replace(">", ">") 
       .Replace("\"", """) 
       .Replace("\'", "'") 
       .Replace("<", "&lt;"); 
} 

しかし、それぞれのReplaceは、新しい文字列インスタンスを作成しますので、これはかなり遅いです。大きな文字列の場合は、文字列を繰り返し処理して文字をStringBuilderに追加する方が良いでしょう。しかし

public static string Escape(string str) 
{ 
    var sb = new StringBuilder(); 
    foreach (var chr in str) 
    { 
     switch (chr) 
     { 
      case '&': 
       sb.Append("&amp;"); 
       break; 
      case '<': 
       sb.Append("&lt;"); 
       break; 
      case '>': 
       sb.Append("&gt;"); 
       break; 
      case '"': 
       sb.Append("&quot;"); 
       break; 
      case '\'': 
       sb.Append("&apos;"); 
       break; 
      default: 
       sb.Append(chr); 
       break; 
     } 
    } 
    return sb.ToString(); 
} 

私はあなたがStringBuilderので、あなたが私のReplace方法を変更し、それにあなたのStringBuilderを渡すことができて、あなたのXMLを構築することをお読みください。したがって、2番目のインスタンスを作成する必要はありません。

しかし、多くの場合、XElementなどのクラスがあなたのために行うので、自分で文字列をエンコードする必要はありません。他の人があなたの質問のコメントで言ったように、LinQ to XML(XElement、...)やXMLシリアル化を使用してXMLを生成する方が簡単だと思います。

完璧のため

関連する問題