我正在使用XDocument.Validate(它的功能似乎与 XmlDocument.Validate 相同)针对 XSD 验证 XML 文档 - 这很好用并且我被告知验证错误。
但是,在ValidationEventHandler(和 XmlSchemaException)中似乎 [可靠地] 公开了一些信息,例如:
- 错误消息(即“‘X’属性无效 - 根据其数据类型‘Z’,值‘Y’无效 - 模式约束失败”),
- 严重性
我想要的是获得验证失败的“失败的 XPath”(这是有意义的):也就是说,我想要获得与 XML 文档相关的失败(而不是 XML 文本)。
有没有办法从中获取“失败的 XPath”信息XDocument.Validate
?如果不是,是否可以通过另一种 XML 验证方法(例如XmlValidatingReader
1 )获得“失败的 XPath” ?
背景:
XML 将通过从 JSON 到 XML 的自动转换(通过 JSON.NET)作为数据发送到我的 Web 服务。因此,我开始处理 XDocument 数据1而不是文本,由于原始 JSON 数据,文本没有保证顺序。由于我不想进入的原因,REST 客户端基本上是 XML 文档上的 HTML 表单字段的包装器,服务器上的验证分两部分进行 - 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"?
});
更新:我在验证 XDocument 时发现捕获架构信息,它链接到“在文档验证期间访问 XML 架构信息”(缓存),我从中确定了两件事:
XmlSchemaException 可以专门化为具有 SourceObject 属性的 XmlSchemaValidationException - 但是,这在验证期间始终返回 null:“当验证 XmlReader 对象在验证期间抛出 XmlSchemaValidationException 时,SourceObject 属性的值为 null”。
我可以通读文档(通过
XmlReader.Read
)并在验证回调之前“记住”路径。虽然这在初始测试中“似乎有效”(没有 ValidationCallback),但对我来说感觉很不雅 - 但我几乎找不到其他东西。