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