验证和修复XML
有没有一种方法可以获取有关验证错误的更多有用信息? XmlSchemaException提供了错误的行号和位置,这对我来说意义不大。 Xml文件毕竟不是关于其瞬时文本表示的。我想得到一个枚举的错误(或者错误代码),该错误指定错误时的内容,节点名称(或者xpath)以定位问题的根源,以便也许我可以尝试解决它。
编辑:我说的是有效的xml文档,只是对特定的模式无效!
解决方案
我个人不确定如何获取更详细的错误,尤其是当我们打开文档并转到提到的位置时,我们可以轻松找到错误。
如果代码无法将文件解析为有效的XML,则很难提供XPATH或者其他命名的XML详细信息。
以我的经验,我们很幸运获得行号和解析位置。
我们可能会考虑通过DTD进行验证,该DTD有时会给出一些更有趣的错误,但是,在我当前正在研究的项目中,我们使用XSLT进行验证。转换检查语法并将错误报告为输出的转换文本。如果我们想进行更友好的错误检查,我会考虑该路线。对我们来说,空的输出意味着没有错误,否则,我们将从XSLT处理中获得有关错误的原因和位置的详细信息。
我们可以通过设置一个XmlReader(其XmlReaderSettings包含架构),然后使用它逐个节点读取输入流来实现此目的。我们可以跟踪读取的最后一个节点,并在发生验证错误时对自己在文档中的位置有一个很好的了解。
我认为,如果我们尝试此练习,则会发现存在很多验证错误(例如缺少必需的元素),而错误节点的概念没有多大意义。是的,在这种情况下,父元素显然是错误的,但是真正引发错误的是读者在没有看到所需元素的情况下遇到了结束标签,这就是为什么错误线和位置指向结束标签的原因。
看来这不是一件容易的事。 Robert Rossney的答案最接近以编程方式解决我的问题,因此我现在就接受。我将继续使用xsl解决方案。任何发现更好的方法来解决验证错误的人都可以响应此线程。