2009-08-14 8 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를를 사용났습니다. 비헤이비어를 정의하는 Validation 속성이 포함 된 XmlReader 및 XmlReaderSettings를 살펴보십시오. – STW

5

내가 CODE TOO있어! 내 테스트에서 이것을 사용

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

이 사람은 (어셈블리 내에서 파일 리소스)를 문자열로 스키마에 소요 스키마 세트에 추가합니다. 유효성을 검사하고 유효하지 않으면 false를 반환합니다.

xml이 유효하지 않은 것으로 확인되지 않으면 부정적 체크를 수행하여 스키마가 엉망이되지 않도록하십시오. 그것의 절대 보장하지,하지만이 내 스키마에서 오류를 찾기 위해 사용했습니다.

+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()); 
     } 
관련 문제