2009-08-14 28 views

Trả lời

15

Hãy thử điều này:

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

đây là trang nhanh nhất, tôi đã sử dụng. –

2

Hope liên kết này giúp:

Validation of XML with XSD

+1

Các liên kết trông đàng hoàng, nhưng tôi nhận thấy ví dụ được sử dụng XmlValidatingReader, đó là lỗi thời. Hãy xem XmlReader và XmlReaderSettings có chứa một số thuộc tính Validation để xác định hành vi. – STW

5

tôi GOT MÃ TOO! Tôi sử dụng này trong các thử nghiệm của tôi:

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

một này có trong các lược đồ như dây đàn (nguồn tập tin trong hội đồng) và thêm chúng vào một bộ đồ. Tôi xác nhận và nếu nó không hợp lệ tôi trả về false.

Nếu xml không được tìm thấy là không hợp lệ, tôi thực hiện kiểm tra âm để đảm bảo các lược đồ của tôi không bị hỏng. Nó không được bảo đảm, nhưng tôi đã sử dụng nó để tìm lỗi trong các lược đồ của tôi.

+1

Bạn có thể thử sử dụng phương thức 'XmlSchema.Read', vì nó có thể xác nhận hợp lệ lược đồ trong khi phân tích nó. –

+0

cảm ơn mã :) – BigOmar

3

giải pháp đơn giản ..

 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()); 
     } 
Các vấn đề liên quan