C# XmlReader总是根据另一个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”实现: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文件时,我需
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:嗯,它可以工作:)。很简单。谢谢