Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:当使用XSD验证XML时,如何从ValidationEventArgs异常创建自定义异常_C#_Xml_Exception_Exception Handling_Xsd - Fatal编程技术网

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

C#:当使用XSD验证XML时,如何从ValidationEventArgs异常创建自定义异常,c#,xml,exception,exception-handling,xsd,C#,Xml,Exception,Exception Handling,Xsd,我有一个根据XSD文件验证的XML文件。 发生验证异常时,将调用处理程序: ValidationCallBack(object sender, System.Xml.Schema.ValidationEventArgs args) 我有框架引发的异常,但我需要自定义此异常,以便有引发此错误的XSD行以及来自XML的不正确值。 我可以解析异常消息以提取此类信息吗?我的意思是,我可以依赖正则表达式吗?您可以从异常成员处获得此信息 static void ValidationCallback(obj

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

ValidationCallBack(object sender, System.Xml.Schema.ValidationEventArgs args)
我有框架引发的异常,但我需要自定义此异常,以便有引发此错误的XSD行以及来自XML的不正确值。
我可以解析异常消息以提取此类信息吗?我的意思是,我可以依赖正则表达式吗?

您可以从
异常
成员处获得此信息

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);
}
编辑:刚刚注意到您需要导致问题的原始元素/内容。首先,您可以从
SchemaObject
获取导致验证问题的模式实体。获取导致问题的原始项目要困难得多。您可能需要重新读取文档(使用非验证读取器)并搜索具有匹配行/位置的节点


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

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

  • 行号
  • 线路位置
  • SourceSchemaObject

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

问题是需要为该异常向客户端抛出自定义消息,而我不能抛出args.message。您能想出一个解决方案吗?是的,我知道,但我需要一个数组[]包含以下内容的值的集合:预期范围、收到的值、XSD中的节点名等等。您能想出一个解决方案吗?请。我已经找到了解决方案,使用XSD文档元素的xmlns:ex=“anySchemaNamespace”属性。然后,我可以添加例如此未处理的属性ex:exception=“My custom exception”任何元素,然后在发生异常时从代码中的元素获取该自定义异常消息。谢谢您的回答。