受託開発担当のRyuです。

最近XMLスキーマを検証することがあったのですが、そのときに躓いた話です。

検証にあたってMSDNにあった以下のコードを使いました。


using System;
using System.Xml;
using System.Xml.Schema;

class XmlSchemaSetExample
{
    static void Main()
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler);

        XmlReader books = XmlReader.Create("books.xml", settings);

        while (books.Read()) { }
    }

    static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
    {
        if (e.Severity == XmlSeverityType.Warning)
        {
            Console.Write("WARNING: ");
            Console.WriteLine(e.Message);
        }
        else if (e.Severity == XmlSeverityType.Error)
        {
            Console.Write("ERROR: ");
            Console.WriteLine(e.Message);
        }
    }
}

なんてことはないシンプルなコードなのですが、実行するとなぜか何の警告やエラーもなく静かに終了してしまいます。
まさかいきなり成功するはずもないので、色々検索した結果以下のフラグを立てることで警告を出すことができました。


settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

MSDNによると、検証を実行しているときに検出されたスキーマ検証警告を出すフラグらしいです。
このフラグを立てた結果、名前空間が間違っていて要素が見つからないという警告がでていることがわかりました。

スキーマの検証は多くの資料が検索すれば出てくるので、簡単にいくかと思っていたのですがどんなところにでも落とし穴はあるものですね。