2012-04-05 17 views
15

मुझे एक सी # विधि को कार्यान्वित करने की आवश्यकता है जिसे बाहरी एक्सएसडी के खिलाफ एक्सएमएल को सत्यापित करने की आवश्यकता है और एक बूलियन परिणाम लौटाता है कि यह अच्छी तरह से बनाया गया था या नहीं।एक विधि में एक्सएसडी के खिलाफ एक्सएमएल मान्य करें

public static bool IsValidXml(string xmlFilePath, string xsdFilePath); 

मुझे पता है कि validate using a callback कैसे करें। मैं जानना चाहता हूं कि कॉलबैक का उपयोग किए बिना इसे एक ही विधि में किया जा सकता है या नहीं। मुझे कॉस्मेटिक उद्देश्यों के लिए पूरी तरह से इसकी आवश्यकता है: मुझे कुछ दर्जन प्रकार के एक्सएमएल दस्तावेजों को प्रमाणित करने की आवश्यकता है, इसलिए मैं नीचे जितना सरल बनाना चाहता हूं।

if(!XmlManager.IsValidXml(
    @"ProjectTypes\ProjectType17.xml", 
    @"Schemas\Project.xsd")) 
{ 
    throw new XmlFormatException(
     string.Format(
      "Xml '{0}' is invalid.", 
      xmlFilePath)); 
} 

उत्तर

39

विकल्प मैं तुम्हें गैर असाधारण घटनाओं के लिए अपवाद का उपयोग करना चाहते हैं या नहीं, पर निर्भर करता है के बारे में सोच सकते हैं के एक जोड़े हैं।

आप सत्यापन कॉलबैक प्रतिनिधि के रूप में एक अशक्त पार कर लेते हैं, के सबसे निर्मित मान्यता तरीकों तो आप बस स्थिति के आधार पर अपवाद को पकड़ने और लौट सकते हैं true/false, अगर एक्सएमएल बुरी तरह से बनाई है एक अपवाद फेंक होगा ।

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    try 
    { 
     xdoc.Validate(schemas, null); 
    } 
    catch (XmlSchemaValidationException) 
    { 
     return false; 
    } 

    return true; 
} 

अन्य विकल्प है कि मन में आता है अपने without using a callback कसौटी की सीमा धक्का। प्री-डिफ़ाइंड कॉलबैक विधि को पारित करने के बजाय, आप इसके बजाय एक अनाम विधि पास कर सकते हैं और true/false वापसी मान सेट करने के लिए इसका उपयोग कर सकते हैं।

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    Boolean result = true; 
    xdoc.Validate(schemas, (sender, e) => 
     { 
      result = false; 
     }); 

    return result; 
} 
+2

नामस्थान नाम क्या है? – hajirazin

+1

@ हाजीराज़िन क्या आपका मतलब है, यह 'एक्सनेस्पेस' है। यह स्निपेट में परिभाषित नहीं है क्योंकि यह – psubsee2003

+0

उदाहरण से संबंधित नहीं था, यहां तक ​​कि मुझे भी वही आवश्यकता थी। मेरे लिए भी काम कर रहा है। धन्यवाद। – hajirazin