2009-08-14 7 views

उत्तर

15

इस प्रयास करें:

public void ValidateXmlDocument(
    XmlReader documentToValidate, string schemaPath) 
{ 
    XmlSchema schema; 
    using (var schemaReader = XmlReader.Create(schemaPath)) 
    { 
     schema = XmlSchema.Read(schemaReader, ValidationEventHandler); 
    } 

    var schemas = new XmlSchemaSet(); 
    schemas.Add(schema); 

    var settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas = schemas; 
    settings.ValidationFlags = 
     XmlSchemaValidationFlags.ProcessIdentityConstraints | 
     XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += ValidationEventHandler; 

    using (var validationReader = XmlReader.Create(documentToValidate, settings)) 
    { 
     while (validationReader.Read()) 
     { 
     } 
    } 
} 

private static void ValidationEventHandler(
    object sender, ValidationEventArgs args) 
{ 
    if (args.Severity == XmlSeverityType.Error) 
    { 
     throw args.Exception; 
    } 

    Debug.WriteLine(args.Message); 
} 
+0

यह सबसे तेज़ है, मैंने उपयोग किया है। –

2

आशा का उपयोग कर ग # इस लिंक में मदद करता है:

Validation of XML with XSD

+1

लिंक सभ्य लग रहा है, लेकिन मैं उदाहरण एक XmlValidatingReader, जो अप्रचलित है उपयोग कर रहा है। स्टॉक XmlReader और XmlReaderSettings पर एक नज़र डालें जिसमें व्यवहार को परिभाषित करने के लिए कुछ प्रमाणीकरण गुण शामिल हैं। – STW

5

मैं कोड बहुत मिल गया! मैं अपने परीक्षणों में इस का उपयोग करें:

public static bool IsValid(XElement element, params string[] schemas) 
    { 
     XmlSchemaSet xsd = new XmlSchemaSet(); 
     XmlReader xr = null; 
     foreach (string s in schemas) 
     { // eh, leak 'em. 
      xr = XmlReader.Create(
       new MemoryStream(Encoding.Default.GetBytes(s))); 
      xsd.Add(null, xr); 
     } 
     XDocument doc = new XDocument(element); 
     var errored = false; 
     doc.Validate(xsd, (o, e) => errored = true); 
     if (errored) 
      return false; 

     // If this doesn't fail, there's an issue with the XSD. 
     XNamespace xn = XNamespace.Get(
         element.GetDefaultNamespace().NamespaceName); 
     XElement fail = new XElement(xn + "omgwtflolj/k"); 
     fail.SetAttributeValue("xmlns", xn.NamespaceName); 
     doc = new XDocument(fail); 
     var fired = false; 
     doc.Validate(xsd, (o, e) => fired = true); 
     return fired; 
    } 

यह एक (फ़ाइल संसाधनों विधानसभा के अंदर) के तारों के रूप में स्कीमा में लेता है और उन्हें एक स्कीमा सेट करने के लिए कहते हैं। मैं मान्य करता हूं और यदि यह मान्य नहीं है तो मैं झूठी वापसी करता हूं।

यदि एक्सएमएल अमान्य नहीं पाया गया है, तो मैं यह सुनिश्चित करने के लिए एक नकारात्मक जांच करता हूं कि मेरी योजनाएं खराब नहीं हुई हैं। यह मूर्खतापूर्ण गारंटी नहीं है, लेकिन मैंने इसका इस्तेमाल अपने स्कीमा में त्रुटियों को खोजने के लिए किया है।

+1

आप 'XmlSchema.Read' विधि का उपयोग करने का प्रयास करना चाहेंगे, क्योंकि यह इसे पार्स करते समय स्कीमा को मान्य कर सकता है। कोड के लिए –

+0

धन्यवाद :) – BigOmar

3

सरल समाधान ..

 try 
     { 
      XmlReaderSettings Xsettings = new XmlReaderSettings(); 
      Xsettings.Schemas.Add(null, "personDivideSchema.xsd"); 
      Xsettings.ValidationType = ValidationType.Schema; 

      XmlDocument document = new XmlDocument(); 
      document.Load("person.xml"); 

      XmlReader reader = XmlReader.Create(new StringReader(document.InnerXml), Xsettings); 


      while (reader.Read()); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message.ToString()); 
     } 
संबंधित मुद्दे

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