में स्ट्रिंग से बचने के लिए मैंने string escape into XML पर एक नज़र डाली और इसे बहुत उपयोगी पाया।एक्सएमएल-एट्रिब्यूट
मैं एक समान काम करना चाहता हूं: XML-विशेषता में उपयोग करने के लिए एक स्ट्रिंग से बचें।
स्ट्रिंग में \ r \ n हो सकता है। एक्सएमएलवाइटर क्लास कुछ \ r \ n -> & #xD जैसे कुछ उत्पन्न करता है; & #xA;
जिस समाधान का मैं वर्तमान में उपयोग कर रहा हूं वह XmlWriter और एक स्ट्रिंगबिल्डर शामिल है और बदसूरत है।
कोई संकेत?
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 वर्ग जो आंतरिक है ...
मेरे विधि मैं इस तरह वर्तमान में usig lokks हूँ उपयोग करता है:
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"
EDIT2:
SecurityElement.Escape(unescaped);
या तो काम नहीं करता।
Edit3 (अंतिम):
लार्स से सभी बहुत उपयोगी टिप्पणियों का उपयोग करना, मेरा अंतिम कार्यान्वयन इस तरह दिखता है:
नोट: .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!" />
आप इस सवाल का जवाब आप ऊपर से जुड़ा हुआ में तकनीक को संशोधित किया जा सका:
वह कुछ इस तरह कहते हैं? क्या होता है यदि आप CreateElement() को CreateAttribute() में बदलते हैं? – LarsH
आपको डबल कोट्स से बचने के लिए भी सुनिश्चित होना चाहिए। –