내가 어떤 대상 네임 스페이스를 정의하지 않는 스키마 파일이 성공적으로 :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...
}
}
어떻게 Validate 메서드를 호출합니까? ValidationEventHandler를 처리합니까? – Jehof
@Jehof 샘플 코드로 제 질문을 업데이트했습니다. –
'XmlReaderSettings'으로 무엇을합니까? – Jehof