XmlReader 始终根据另一个 Xsd 文件验证 Xsd 文件是否有效

XmlReader always validates a Xsd file against another Xsd file as valid

我发现 XmlReader 的行为很奇怪。当使用它来验证 Xml 与 Xsd 时,everythink 工作正常并且符合我的期望。但是当我尝试根据另一个 Xsd 验证一个 Xsd 文件时,它不会抛出任何验证异常。

为了更好地解释我的用例:我有一个应用程序,用户可以在其中上传 Xml 文件,例如数据输入。用户必须为已上传的 xml 文件上传一个 xsd 文件,然后根据已上传的 Xsd 文件验证 Xml 文件。但是如果用户上传新的 Xsd 文件作为 Xml 文件(Xsd 有效 Xml)然后上传另一个 Xsd 文件首先进行验证 Xsd 文件,我需要通知验证消息,即 Xml 文件(在本例中为第一个 Xms 文件)对上传的 Xsd 文件(第二个 Xsd 文件)无效。

这是我自己的 "wraper" 实现 XmlReader:

public static class XmlReader
{
    public static XmlDocument GetSchemaDocument(Stream stream)
    {
        var schemaDocument = new XmlDocument();
        var schemaDocumentReader = new XmlTextReader(stream);
        schemaDocument.Load(schemaDocumentReader);

        return schemaDocument;
    }

    public static XmlReaderSettings GetXmlReaderSettings(Stream stream)
    {
        var schemaSet = new XmlSchemaSet();
        var schemaSetReader = new XmlTextReader(stream);
        schemaSet.Add("", schemaSetReader);

        var settings = new XmlReaderSettings
        {
            ValidationType = ValidationType.Schema,
            Schemas = schemaSet,

        };
        settings.ValidationEventHandler += ValidationEventHandler;

        return settings;
    }

    public static XmlDocument GetXmlDocument(Stream stream, XmlReaderSettings settings)
    {
        var reader = System.Xml.XmlReader.Create(stream, settings);
        var document = new XmlDocument();
        document.Load(reader);

        return document;
    }

    static void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        if(e.Severity == XmlSeverityType.Error)
            throw new ValidationException("Xml does not valid with Xsd.");
    }
}

我的问题是为什么 XmlReader 将任何 Xsd 文件验证为另一个 Xsd 文件有效?

正如 Pawel 所写。

解决方法是使用XmlSchemaValidationFlags.ReportValidationWarnings.