.NET 5下使用XmlReader做XML验证时如何获取Validation Exception子类型
.NET 5+ 下XSD验证错误类型识别解决方案
最优方案:通过错误码直接匹配错误类型,完全规避本地化影响
你不需要匹配错误消息文本,验证触发的XmlSchemaException提供了固定的ErrorCode属性,是int类型的唯一错误标识,和你之前在.NET Framework中拿到的Sch_InvalidElementContentExpecting这类编码一一对应,不受任何语言配置影响。
你可以在验证事件回调中直接判断该属性值,输出对应自定义友好提示,示例代码如下:
var xmlReaderSettings = new XmlReaderSettings { ValidationType = ValidationType.Schema, ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings }; // 注册验证事件回调 xmlReaderSettings.ValidationEventHandler += (sender, args) => { if (args.Severity == XmlSeverityType.Error && args.Exception is XmlSchemaException schemaEx) { switch (schemaEx.ErrorCode) { // 对应原Sch_InvalidElementContentExpecting错误 case unchecked((int)0x80131940): Console.WriteLine("XML节点结构错误,不符合会计数据规范要求,期望的节点列表可参考规范说明"); break; // 其他需要处理的错误类型按需添加对应case即可 } } }; using var validatingReader = XmlReader.Create("待验证的XML文件路径", xmlReaderSettings); // 执行读取触发验证 while (validatingReader.Read()) { }
所有错误码和错误类型的对应关系,可以从.NET官方开源源码的System.Xml.Schema模块资源定义中查询到。
方案2:强制固定错误消息为英文
如果你确实需要匹配错误消息文本,可以通过设置线程区域性保证所有错误消息固定返回英文,不会受到系统语言配置影响:
- 程序启动时全局配置:
// 配置全局默认区域性为不变文化(英文) CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
- 异步场景下可在验证逻辑执行前,显式设置当前线程UI区域性:
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
.NET 5+ 默认没有内置非英文的系统错误消息资源,除非你手动安装了对应语言的语言包,所以只要做了上述配置,就可以保证错误消息固定为默认英文模板格式。
方案3:错误消息模板获取路径
所有XSD验证相关的默认英文消息模板,都定义在.NET Runtime源码的System.Xml.Schema模块的资源文件中,你可以直接查询所有模板的占位符格式,用于消息匹配。
内容的提问来源于stack exchange,提问作者Wolfgang Grinfeld
相关产品推荐
相关产品推荐

