2009-08-14 6 views

Odpowiedz

15

Spróbuj tego:

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

to najszybszy, którego używałem. –

2

Nadzieja ten link pomoże:

Validation of XML with XSD

+1

Link wygląda przyzwoite, ale zauważyłem przykład używa XmlValidatingReader, który jest przestarzały. Zapoznaj się z tabelami XmlReader i XmlReaderSettings, które zawierają niektóre właściwości sprawdzania poprawności, aby zdefiniować zachowanie. – STW

5

I GOT KOD też! Używam tego w moich testów:

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

Ten jeden zajmuje się schematów jako ciągi (zasobów plików w zespole) i dodaje je do zestawu schematu. Sprawdzam i jeśli nie jest poprawny, zwracam wartość false.

Jeśli xml nie zostanie uznany za nieważny, wykonuję kontrolę ujemną, aby upewnić się, że moje schematy nie zostały zgniecione. Jego nie gwarantuje niezawodności, ale użyłem tego, aby znaleźć błędy w moich schematach.

+1

Możesz spróbować użyć metody 'XmlSchema.Read', ponieważ może sprawdzić poprawność schematu podczas analizowania. –

+0

dzięki za kod :) – BigOmar

3

prostsze rozwiązanie ..

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