c#:当使用XSD验证XML时,如何从ValidationEventArgs异常创建自定义异常

本文关键字:ValidationEventArgs 异常 自定义异常 创建 XSD XML 验证 | 更新日期: 2023-09-27 18:07:51

我有一个针对XSD文件进行验证的XML文件。当发生验证异常时,调用处理程序:

ValidationCallBack(object sender, System.Xml.Schema.ValidationEventArgs args)

我有框架抛出的异常,但是我需要自定义这个异常,以便有抛出这个错误的XSD行以及不正确的XML值。我可以解析异常消息以提取此类信息吗?我的意思是,我能依靠正则表达式吗?

c#:当使用XSD验证XML时,如何从ValidationEventArgs异常创建自定义异常

您可以从Exception成员那里获得这些信息。

static void ValidationCallback(object sender, ValidationEventArgs args)
{
    // Not sure if the exception is guaranteed to not be null.
    if (args.Exception != null)
    {
        // Remember to always retain the InnerException (last argument is args.Exception).
        throw new MyException(args.Exception.LineNumber, args.Exception.LinePosition, args.Exception.Message, args.Exception);
    }
    // If the exception is null do what we can.
    throw new MyException(-1, -1, args.Message, args.Exception);
}

EDIT:刚刚注意到您想要的是导致问题的原始元素/事物。首先,您可以从SchemaObject中获得导致验证问题的模式实体。找到造成问题的原始物品要困难得多。您可能需要重新读取文档(使用非验证阅读器),并搜索具有匹配行/位置的节点。

旁注:请永远不要使用正则表达式。如果你的应用程序在另一个语言环境中运行,你会遇到非常严重的问题:因为所有内置的。net异常都有翻译(所以你的regex将无法工作)。

您可以通过查看XmlSchemaException类的公共属性(其实例可通过args参数的Exception属性获得)来查找验证异常的详细信息:

  • LineNumber
  • LinePosition
  • SourceSchemaObject

我已经找到了解决方案,通过为xsd文档元素使用xmlns:ex="anySchemaNamespace"属性。然后,我可以向任何元素添加例如这个未处理的属性ex:exception="My custom exception",然后在发生异常时从代码中的元素中获取该自定义异常消息。谢谢你的回答。

相关文章:
  • 没有找到相关文章