然而,在ValidationEventHandler(以及XmlSchemaException)中只有一些信息被可靠地公开,例如:
- 错误消息(即“'X'属性无效 - 值“Y”根据其数据类型“Z”无效 - 模式约束失败”) - 严重程度
我希望能够获得验证失败的“XPath”(如果有意义的话)。也就是说,我想要获取与XML文档相关的失败(而不是XML文本)。
是否有一种方法可以从
XDocument.Validate
中获得“failing XPath”信息?如果没有,是否可以通过其他XML验证方法(例如XmlValidatingReader
1)获取“failing XPath”?背景:
XML将作为数据发送到我的Web服务,并通过JSON.NET自动转换为XML。因此,由于原始JSON数据的顺序不确定,我开始处理XDocument数据而不是文本。REST客户端基本上是HTML表单字段的包装器,用于XML文档和服务器上的验证分为两个部分 - XML模式验证和业务规则验证。
在业务规则验证中,很容易返回不符合规范的字段的“XPath”,以便在客户端上指示失败的字段。我想将此扩展到XSD模式验证,该验证处理基本结构验证以及更重要的属性的基本“数据类型”和“存在性”。但是,由于所需的自动过程(即突出显示适当的失败字段)和源转换,仅使用原始文本消息和源行/列号并不十分有用。
这是一段验证代码片段:
// Start with an XDocument object - created from JSON.NET conversion
XDocument doc = GetDocumentFromWebServiceRequest();
// Load XSD
var reader = new StringReader(EmbeddedResourceAccess.ReadResource(xsdName));
var xsd = XmlReader.Create(reader, new XmlReaderSettings());
var schemas = new XmlSchemaSet();
schemas.Add("", xsd);
// Validate
doc.Validate(schemas, (sender, args) => {
// Process validation (not parsing!) error,
// but how to get the "failing XPath"?
});
更新:我找到了一个链接:Capture Schema Information when validating XDocument,其中链接到“在文档验证期间访问XML模式信息”(缓存版本),从中我确定了两件事情:
XmlSchemaException可以特化为XmlSchemaValidationException,它有一个SourceObject属性 - 然而,在验证过程中这个属性总是返回null:“当通过验证的XmlReader对象抛出XmlSchemaValidationException时,SourceObject属性的值为null”。
我可以通过
XmlReader.Read
读取文档并在验证回调之前“记住”路径。虽然这在没有验证回调的初始测试中“似乎有效”,但对我来说感觉相当不雅 - 但我几乎找不到其他方法。