2013-06-21 3 views
2

내가 어떤 대상 네임 스페이스를 정의하지 않는 스키마 파일이 성공적으로 :XDocument.Validate는 항상 정의는 다음과 같다 즉

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <!--Elements, attributes, etc. --> 
</xs:schema> 

대응하는 XML은 다음과 같습니다

<Documents p1:CRC="0" p1:Date="1900-01-01T01:01:01+01:00" p1:Name="Test" p1:Status="new" xmlns:p1="http://www.tempuri.org/pdms.xsd" xmlns="http://www.tempuri.org/pdms.xsd"> 
    <p1:Document p1:Date="2010-12-23T07:59:45" p1:ErrorCode="0" p1:ErrorMessage="" p1:Number="TEST00001" p1:Status="new"/> 
</Documents> 

예를 들어 스키마에 대한이 XML의 유효성 검사 Altova XMLSpy 또는 Oxygen XML Editor가 실패합니다.

그러나 C# (.NET 4.0)에서의 유효성 검사는 실패하지 않습니다. XML은 XDocument 개체로 처리됩니다. 올바르게 이해했다면 XDocument.Validate()은 스키마에서 네임 스페이스가 발견되지 않으면 느슨한 유효성 검사를 수행합니다. 따라서 유효성 검사가 실패하지 않습니다. 그렇다면 XDocument에 대한 "엄격한"유효성 검사를 어떻게 구현할 수 있습니까?

이 내가 XML 유효성을 검사 할 방법이다 : 나는 유효성 검사 방법을 사용할 수 있습니다 확실하지 않다

public static void ValidateXml(XDocument xml, string xsdFilename) { 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    XmlSchemaSet schemaSet = new XmlSchemaSet(); 

    schemaSet.Add(string.empty, xsdFilename); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); 

    xml.Validate(schemaSet, ValidationCallback); 
} 

private static void ValidationCallback(object sender, ValidationEventArgs args) { 
    if (args.Severity == XmlSeverityType.Warning) { 
    // Do warning stuff... 
    } else if (args.Severity == XmlSeverityType.Error) { 
    // Do error stuff... 
    } 
} 
+0

어떻게 Validate 메서드를 호출합니까? ValidationEventHandler를 처리합니까? – Jehof

+0

@Jehof 샘플 코드로 제 질문을 업데이트했습니다. –

+1

'XmlReaderSettings'으로 무엇을합니까? – Jehof

답변

11

을; 당신이

 XDocument doc = XDocument.Load("../../XMLFile1.xml"); 

     XmlSchemaSet schemaSet = new XmlSchemaSet(); 
     schemaSet.Add(null, "../../XMLSchema1.xsd"); 

     XmlReaderSettings xrs = new XmlReaderSettings(); 
     xrs.ValidationType = ValidationType.Schema; 
     xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
     xrs.Schemas = schemaSet; 
     xrs.ValidationEventHandler += (o, s) => { 
      Console.WriteLine("{0}: {1}", s.Severity, s.Message); 
     }; 

     using (XmlReader xr = XmlReader.Create(doc.CreateReader(), xrs)) 
     { 
      while (xr.Read()) { } 
     } 

같이 ValidationFlags이 검증 경고를 방출하도록 설정되어하여 XDocument, 통해 검증 XmlReader를 사용하는 경우 다음의 ValidationEventHandler는 대한 스키마 정보를 찾을 수없는 각 노드에 대한 경고를 방출 않습니다. 따라서 ValidationEventHandler는 그러한 경고를 검사 할 수 있습니다. 그러나 Validate 메소드를 호출하기 전에 doc.Root.Name.Namespace와 대상 스키마의 대상 네임 스페이스를 간단히 비교할 수 있습니다.

관련 문제