2009-11-10 13 views
9

मैं Xml achives deserialize करने के लिए XmlSerializer उपयोग कर रहा हूँ। लेकिन मुझे लगता है कि कक्षा xsd.exe उत्पन्न केवल एक्सएमएल पढ़ने की क्षमता प्रदान करता है, लेकिन कोई सत्यापन नहीं है। उदाहरण के लिए यदि एक नोड एक दस्तावेज में याद आ रही है, उत्पन्न वर्ग की विशेषता फ़ील्ड रिक्त हो जाएगा, के बजाय एक मान्यता अपवाद फेंकता है के रूप में मैं उम्मीद थी। मैं उसे कैसे प्राप्त कर सकता हूं? धन्यवाद!XmlSerializer सत्यापन

उत्तर

26

निम्नलिखित कोड एक स्कीमा के विरुद्ध सत्यापन चाहिए, जबकि deserializing। क्रमबद्ध करने के दौरान एक स्कीमा के खिलाफ सत्यापन करने के लिए इसी तरह के कोड का उपयोग किया जा सकता है।

private static Response DeserializeAndValidate(string tempFileName) 
{ 
    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add(LoadSchema()); 

    Exception firstException = null; 

    var settings = new XmlReaderSettings 
        { 
         Schemas = schemas, 
         ValidationType = ValidationType.Schema, 
         ValidationFlags = 
          XmlSchemaValidationFlags.ProcessIdentityConstraints | 
          XmlSchemaValidationFlags.ReportValidationWarnings 
        }; 
    settings.ValidationEventHandler += 
     delegate(object sender, ValidationEventArgs args) 
     { 
      if (args.Severity == XmlSeverityType.Warning) 
      { 
       Console.WriteLine(args.Message); 
      } 
      else 
      { 
       if (firstException == null) 
       { 
        firstException = args.Exception; 
       } 

       Console.WriteLine(args.Exception.ToString()); 
      } 
     }; 

    Response result; 
    using (var input = new StreamReader(tempFileName)) 
    { 
     using (XmlReader reader = XmlReader.Create(input, settings)) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof (Response)); 
      result = (Response) ser.Deserialize(reader); 
     } 
    } 

    if (firstException != null) 
    { 
     throw firstException; 
    } 

    return result; 
} 
+2

इस समाधान को साझा करने के लिए धन्यवाद। इस deserialize साथ में लाइन सत्यापन का कहना है XmlReader के माध्यम से मान्य द्वारा, यह एक बेहतर तरीका है। – el2iot2

4

निम्नलिखित कोड मैन्युअल रूप से लोड और प्रोग्राम के रूप में एक स्कीमा फ़ाइल के खिलाफ अपने एक्सएमएल को मान्य, आप किसी भी resulting errors and/or warnings के साथ सौदा करने की इजाजत दी जाएगी।

//Read in the schema document 
using (XmlReader schemaReader = XmlReader.Create("schema.xsd")) 
{ 
    XmlSchemaSet schemaSet = new XmlSchemaSet(); 

    //add the schema to the schema set 
    schemaSet.Add(XmlSchema.Read(schemaReader, 
    new ValidationEventHandler(
     delegate(Object sender, ValidationEventArgs e) 
     { 
     }  
    ))); 

    //Load and validate against the programmatic schema set 
    XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocument.Schemas = schemaSet; 
    xmlDocument.Load("something.xml"); 

    xmlDocument.Validate(new ValidationEventHandler(
     delegate(Object sender, ValidationEventArgs e) 
     { 
      //Report or respond to the error/warning 
     } 
    )); 
} 

अब स्पष्ट रूप से आप xsd.exe द्वारा उत्पन्न स्वचालित रूप से ऐसा करने के लिए कक्षाओं की इच्छा और लोड करते समय (ऊपर दृष्टिकोण एक्सएमएल फ़ाइल के एक दूसरे से निपटने की आवश्यकता होगी), लेकिन एक पूर्व लोड सत्यापित करें की अनुमति होगी आप प्रोग्रामेटिक रूप से एक विकृत इनपुट फ़ाइल का पता लगाने के लिए।

+0

@ जॉन सॉन्डर्स - मुझे लगता है कि वर्ग पीढ़ी कोड इसके संचालन किसी भी समय जल्द ही बदलने की संभावना है पर शक कर रहा हूँ, और MSDN साइट xsd.exe के लिए कोई भी प्रासंगिक विकल्प दिखाता है, इसलिए मुझे लगता है कि यह एक सुझाव देने के लिए उचित है वर्कअराउंड ... – el2iot2

+1

प्रश्न पाठ में, ओपी व्यक्त करता है कि वह एक अमान्य इनपुट xml के लिए एक अपवाद फेंकना चाहता है। यह दृष्टिकोण इसे पूरा करता है। मैं दावा नहीं कर रहा हूं कि यह एकमात्र तरीका है जिसे किया जा सकता है, या यहां तक ​​कि यह सबसे अच्छा तरीका है। लेकिन मैं एक दृष्टिकोण है कि मैंने पहले भी इस्तेमाल किया था आम तौर पर एक्सएमएल दस्तावेजों को मान्य करने के (मेरे सिर के ऊपर से) के साथ जवाब दिया गया था। – el2iot2