XmlReader始终将Xsd文件与另一个Xsd文件验证为有效

时间:2015-05-15 15:17:15

标签: c# xml xsd xmlreader xml-validation

我有XmlReader的奇怪行为。当使用它来验证Xml对抗Xsd时,everythink工作正常,我的期望。但是当我尝试针对另一个Xsd验证Xsd文件时,它不会抛出任何验证异常。

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

这是我自己的"包装"实现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文件是否有效?

1 个答案:

答案 0 :(得分:2)

帕维尔写道。

解决方案是使用XmlSchemaValidationFlags.ReportValidationWarnings。