C# XmlReader总是根据另一个Xsd文件验证一个Xsd文件是否有效

C# XmlReader总是根据另一个Xsd文件验证一个Xsd文件是否有效,c#,xml,xsd,xmlreader,xml-validation,C#,Xml,Xsd,Xmlreader,Xml Validation,我发现XmlReader的行为很奇怪。当使用它对Xsd进行Xml验证时,everythink工作得很好,正如我所期望的那样。但是,当我尝试针对另一个Xsd验证一个Xsd文件时,它不会抛出任何验证异常 为了更好地解释我的用例:我有一个应用程序,用户可以在其中上传类似于数据输入的Xml文件。用户必须为已上载的xml文件上载xsd文件,然后根据已上载的xsd文件验证xml文件。但是,当用户上传新的Xsd文件作为Xml文件(Xsd是有效的Xml),然后上传另一个Xsd文件进行验证第一个Xsd文件时,我需

我发现XmlReader的行为很奇怪。当使用它对Xsd进行Xml验证时,everythink工作得很好,正如我所期望的那样。但是,当我尝试针对另一个Xsd验证一个Xsd文件时,它不会抛出任何验证异常

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

下面是我自己的XmlReader“wraper”实现:

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。

如果xml使用名称空间,而文档不在名称空间中,则默认情况下验证将始终通过,因为文档不会被验证。您需要打开报告警告(XmlSchemaValidationFlags.ReportValidationWarnings)。有关更多详细信息,请参阅本文:@Pawel:嗯,它可以工作:)。很简单。谢谢