2009-08-14 15 views

cevap

15

bu deneyin:

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

Bu en hızlı olanı kullanıyorum. –

2

Umut kullanarak bu bağlantı yardımcı olur:

Validation of XML with XSD

+1

bağlantı iyi görünüyor, ama ben örnek kullanılmıyor bir XmlValidatingReader kullanıyor ettim. Davranışı tanımlamak için bazı Doğrulama özelliklerini içeren XmlReader ve XmlReaderSettings stoklarına bakın. – STW

5

Ben kodu çok ANLADIM! Benim testlerde bu kullanın:

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; 
    } 

Bu seferki (düzeneği içindeki dosya kaynaklarını) dizeleri olarak şemalarında alır ve bir şema kümesine ekler. Doğrularım ve geçerli değilse yanlış döndürüyorum.

xml'nin geçersiz olmadığı anlaşılırsa, şemalarımın vidalanmadığından emin olmak için negatif bir kontrol yapıyorum. Sağlam garanti edilmez, ama şemalarımda hata bulmak için bunu kullandım.

+1

"XmlSchema.Read" yöntemini kullanmayı deneyebilirsiniz, çünkü şema ayrıştırılırken doğrulanabilir. –

+0

kod için teşekkürler :) – BigOmar

3

basit bir çözüm ..

 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()); 
     } 
İlgili konular