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

我有一个XML文件,它是根据XSD文件验证的 . 发生验证异常时,将调用该处理程序:

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

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

回答(3)

2 years ago

您可以从 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 获取导致验证问题的架构实体 . 获取导致问题的原始项目更加困难 . 您可能不得不重新读取文档(使用非验证读取器)并搜索具有匹配行/位置的节点 .

Side note: 请不要't use regex, ever. You will get really nasty problems if your application is run on another locale: as all the built-in .Net exceptions have translations (so your regex won'工作) .

2 years ago

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

  • LineNumber

  • LinePosition

  • SourceSchemaObject

2 years ago

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