2010-12-16 8 views
9

में स्ट्रिंग से बचने के लिए मैंने 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&#xD;&#xA;Bar"

में परिणाम होगा

EDIT2:

SecurityElement.Escape(unescaped); 

या तो काम नहीं करता।

Edit3 (अंतिम):

लार्स से सभी बहुत उपयोगी टिप्पणियों का उपयोग करना, मेरा अंतिम कार्यान्वयन इस तरह दिखता है:

नोट: .Replace("\r", "&#xD;").Replace("\n", "&#xA;"); मान्य 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", "&#xD;").Replace("\n", "&#xA;"); 
    } 

यह पता चला है के रूप में इस मान्य XML है और किसी भी मानक के अनुरूप XML-पार्सर द्वारा पार्स किए जाएंगे:

<response message="Thank you, 
LarsH!" /> 
+1

आप इस सवाल का जवाब आप ऊपर से जुड़ा हुआ में तकनीक को संशोधित किया जा सका:

वह कुछ इस तरह कहते हैं? क्या होता है यदि आप CreateElement() को CreateAttribute() में बदलते हैं? – LarsH

+0

आपको डबल कोट्स से बचने के लिए भी सुनिश्चित होना चाहिए। –

उत्तर

7

समाधान को संशोधित आप संदर्भित, कैसे के बारे में

public static string XmlEscape(string unescaped) 
{ 
    XmlDocument doc = new XmlDocument(); 
    var node = doc.CreateAttribute("foo"); 
    node.InnerText = unescaped; 
    return node.InnerXml; 
} 

सभी मैंने CreatElement() को CreateAttribute() में बदल दिया था। विशेषता नोड प्रकार में InnerText और InnerXml गुण हैं।

मेरे पास इसका परीक्षण करने के लिए पर्यावरण नहीं है, लेकिन मुझे यह जानकर उत्सुकता होगी कि यह काम करता है या नहीं।

अद्यतन: या अधिक सरलता से, SecurityElement.Escape() का उपयोग करें जैसा कि आपने लिंक किए गए प्रश्न के दूसरे उत्तर में सुझाया है। यह उद्धरण चिह्नों से बच जाएगा, इसलिए यह विशेषता टेक्स्ट के लिए उपयोग करने के लिए उपयुक्त है।

अद्यतन 2: कृपया ध्यान दें कि रिटर्न गाड़ी और लाइन फ़ीड एक्सएमएल अच्छी तरह से गठित होने के लिए एक विशेषता मान में भाग निकले जा करने के लिए, की जरूरत नहीं है। यदि आप उन्हें अन्य कारणों से बचने के लिए चाहते हैं, तो आप इसे String.replace(), उदा।

SecurityElement.Escape(unescaped).Replace("\r", "&#xD;").Replace("\n", "&#xA;"); 

या

return node.InnerXml.Replace("\r", "&#xD;").Replace("\n", "&#xA;"); 
+0

क्षमा करें, लेकिन न ही काम करता है। (संपादन देखें) –

+0

@ सिमॉन, क्या आप अपनी कार को मैकेनिक में ले जाएंगे और बस यह कहेंगे कि "काम नहीं करता"? वास्तव में क्या हुआ यह निर्दिष्ट करने के बारे में कैसे? और यह आपके द्वारा अपेक्षित चीज़ों से अलग कैसे है। अन्यथा आप यह अनुमान लगाने के लिए छोड़ देते हैं कि समस्या क्या है। – LarsH

+0

"<" बच निकला है "\ r" और "\ n" नहीं हैं - जैसा कि मैंने अपने मूल प्रश्न में अपने संपादन में समझाया है। –

-1

अगर यह कई भाषा में, किसी भी मदद की हो सकता है, एक सभी XML विशेष वर्ण से बचने के लिए createCDATASection उपयोग करता है। इतना है कि यह एक विशेषता नोड बनाता है, नोड के innerText में स्ट्रिंग सामान, और इसके innerXML अर्क,

<tag><![CDATA[ <somecontent/> ]]></tag> 
+2

@ माथियास, ओपी ने एक विशेषता * में उपयोग किए जाने वाले स्ट्रिंग से बचने के बारे में पूछा। क्या आप एक विशेषता मूल्य में सीडीएटीए अनुभाग डाल सकते हैं? – LarsH

+1

मुझे जवाब देने से पहले प्रश्न पढ़ना चाहिए ...एक विशेषता मूल्य में सीडीएटीए का उपयोग नहीं किया जा सकता है। –