我正在尝试针对模式验证XML文档(该模式作为资源嵌入在我的程序中)。我已经完成了所有工作,所以我尝试通过在模式指定maxOccurs="1"
的位置的XML中添加第二个兄弟节点来测试错误。问题是我的ValidationEventHandler
永远不会被调用,XmlDocument.Load()
在我预期XmlSchemaValidationException
这样做时会抛出XmlDocument.Validate()
异常。
这是我的代码:
private void ValidateUserData( string xmlPath )
{
var resInfo = Application.GetResourceStream( new Uri( @"MySchema.xsd",
UriKind.Relative ) );
var schema = XmlSchema.Read( resInfo.Stream, SchemaValidationCallBack );
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add( schema );
schemaSet.ValidationEventHandler += SchemaValidationCallBack;
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas = schemaSet;
settings.ValidationType = ValidationType.Schema;
XmlDocument doc = new XmlDocument();
using( XmlReader reader = XmlReader.Create( xmlPath, settings ) ) {
doc.Load( reader ); // <-- This line throws an exception if XML is ill-formed
reader.Close();
}
doc.Validate( SchemaValidationCallBack );// <-- This is never reached
}
private void SchemaValidationCallBack( object sender, ValidationEventArgs e )
{
Console.WriteLine( "SchemaValidationCallBack: " + e.Message );
}
如何调用回调函数以便处理验证错误?
感谢您的帮助!
答案 0 :(得分:3)
你必须处理XmlReaderSettings类的ValidationEventHandler envet。
如果您的XSD文件无效,将触发XmlSchemaSet.ValidationEventHandler事件。
如果您的XML违反XSD,将触发XmlReaderSettings.ValidationEventHandler事件。