XmlDocument.Load()抛出XmlSchemaValidationException

时间:2011-01-18 03:45:46

标签: c# xml xsd

我正在尝试针对模式验证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 );
}

如何调用回调函数以便处理验证错误?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

你必须处理XmlReaderSettings类的ValidationEventHandler envet。

如果您的XSD文件无效,将触发XmlSchemaSet.ValidationEventHandler事件。

如果您的XML违反XSD,将触发XmlReaderSettings.ValidationEventHandler事件。