2011-02-16 15 views
9

मेरे पास एक टेक्स्टबॉक्स है जिसे अंततः एक्सएमएल नोड में सहेजा जाता है। मैं x12 को सहेजने से पहले अमान्य वर्णों से बचने के लिए SecurityElement.Escape (string2Escape) का उपयोग कर रहा हूं।SecurityElement.IsValidText "&" पर सत्य लौटाता है ... क्यों?

समस्या: मैंने परीक्षण के लिए IsValidText का उपयोग करने का प्रयास किया है, यदि मुझे बचने की विधि चलाने की आवश्यकता है, लेकिन यह '' 'और' & 'मान्य के रूप में लौटाता है लेकिन फिर जब आप xml को सिस्टम barfs को सहेजते हैं क्योंकि वे वास्तव में हैं , मान्य नहीं है। ऐसा लगता है कि '<' या '>' पर झूठी वापसी होती है।

सरल समाधान, चेक को हटाएं, लेकिन मेरा सवाल यह है कि यह मामला क्यों होगा?

पीछा कर रहा है मेरी नाकाम रहने कोड:

private string EscapeXML(string nodeText) 
{ 
    if (!SecurityElement.IsValidText(nodeText)) 
    { 
     return SecurityElement.Escape(nodeText); 
    } 
    return nodeText; 
} 

उत्तर

2

SecurityElement निर्माता जाहिरा तौर पर पहले से ही, कुछ ("&" चरित्र सहित) अपने आप ही भागने ऐसा करने से IsValidText केवल अक्षर निर्माता पहले से ही की देखभाल नहीं कर रहा है के लिए जाँच किया जा रहा है है। परिणामस्वरूप, सुरक्षा सुरक्षा के IsValidText/Escape कॉम्बो का उपयोग करने के लिए यह सुरक्षित नहीं दिखता है, जब तक कि आप संपूर्ण xml बनाने के लिए SecurityElement का उपयोग नहीं कर रहे हों।

मैं एक उदाहरण के साथ बेहतर समझाने की कोशिश करेंगे:

using System; 
using System.Diagnostics; 
using System.Security; 

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     // the SecurityElement constructor escapes the & all by itself 
     var xmlRoot = 
      new SecurityElement("test","test &"); 

     // the & is escaped without SecurityElement.Escape 
     Console.WriteLine (xmlRoot.ToString()); 

     // this would throw an exception (the SecurityElement constructor 
     // apparently can't escape <or>'s 
     // var xmlRoot2 = 
     // new SecurityElement("test",@"test & > """); 

     // so this text needs to be escaped before construction 
     var xmlRoot3 = 
      new SecurityElement("test",EscapeXML(@"test & > """)); 
     Console.WriteLine (xmlRoot3.ToString()); 

    } 

    private static string EscapeXML(string nodeText) 
    { 
     return (SecurityElement.IsValidText(nodeText))? 
      nodeText : 
      SecurityElement.Escape(nodeText); 
    } 
} 
5

यहाँ मैं क्या परावर्तक से मिला है। कारण है कि यह जिस तरह से यह व्यवहार कर रहा है बर्ताव कर रहा है enter image description here enter image description here

यह समझा सकते हैं। मुझे सुरक्षा एलीमेंट में कोई भी विधि दिखाई नहीं दे रही है जो आप खोज रहे हैं लेकिन एक विस्तार विधि के रूप में, स्वयं को लागू करने के लिए यह काफी आसान है।

संबंधित मुद्दे