8

ターゲット名前空間を定義していないスキーマ ファイルがあります。つまり、その定義は次のようになります。

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

Altova XMLSpy や Oxygen XML Editor などを使用したスキーマに対するこの XML の検証は失敗します。

ただし、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...
  }
}
4

1 に答える 1