XML への文字列エスケープを調べたところ、非常に役立つことがわかりました。
同様のことをしたいと思います: XML 属性で使用される文字列をエスケープします。
文字列には \r\n が含まれる場合があります。XmlWriter クラスは \r\n -> のようなものを生成します。
私が現在使用しているソリューションには、XmlWriter と StringBuilder が含まれており、かなり醜いです。
ヒントはありますか?
Edit1: LarsH
を失望させて申し訳ありません。私の最初のアプローチを購入するのは
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
return attr.InnerXml;
}
それは動作しません。XmlEscapeAttribute("Foo\r\nBar")
結果として"Foo\r\nBar"
.NET Reflector を使用して、XmlTextWriter が属性をエスケープする方法を調べました。内部の XmlTextEncoder クラスを使用しています...
現在、次のようなロックを使用している私の方法:
public static string XmlEscapeAttribute(string unescaped)
{
if (String.IsNullOrEmpty(unescaped)) return unescaped;
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
writer.WriteStartElement("a");
writer.WriteAttributeString("a", unescaped);
writer.WriteEndElement();
writer.Flush();
sb.Length -= "\" />".Length;
sb.Remove(0, "<a a=\"".Length);
return sb.ToString();
}
それは醜く、おそらく遅いですが、うまくXmlEscapeAttribute("Foo\r\nBar")
いきます:"Foo
Bar"
編集2:
SecurityElement.Escape(unescaped);
どちらも機能しません。
Edit3 (最終):
Lars からの非常に有益なコメントをすべて使用すると、最終的な実装は次のようになります。
注: は.Replace("\r", "
").Replace("\n", "
");
有効な XML には必要ありません。あくまで美容対策です!
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
// The Replace is *not* required!
return attr.InnerXml.Replace("\r", "
").Replace("\n", "
");
}
結局のところ、これは有効な XML であり、標準に準拠した XML パーサーによって解析されます。
<response message="Thank you,
LarsH!" />