【问题标题】:Validating and reparing xml验证和修复 xml
【发布时间】:2008-09-30 20:25:22
【问题描述】:

有没有办法获得有关验证错误的更多有用信息? XmlSchemaException 提供了错误的行号和位置,这对我来说毫无意义。 XML 文档毕竟不是关于它的瞬态文本表示。我想得到一个枚举错误(或错误代码),指定什么时候出错,节点名称(或 xpath)来定位问题的根源,以便我可以尝试修复它。

编辑:我说的是有效的 xml 文档——只是对特定架构无效!

【问题讨论】:

    标签: c# xml xsd


    【解决方案1】:

    根据我的经验,你很幸运能得到行号和解析位置。

    【讨论】:

      【解决方案2】:

      您可能会考虑通过 DTD 进行验证,它有时会产生一些更有趣的错误,但是,在我目前从事的一个项目中,我们使用 XSLT 进行验证。转换检查语法并将错误报告为输出的转换文本。如果您想要更友好的错误检查,我会考虑这条路线。对我们来说,空输出意味着没有错误,否则我们可以从 XSLT 处理中获得一些关于错误是什么以及在哪里的详细信息。

      【讨论】:

      • 谢谢!您正在谈论诸如schematron之类的东西。我目前正在做同样的事情,但它对尝试在运行时修复有问题的 xml 文档的任务没有帮助。
      • 如果您编写自己的 XSLT,您将有更好的修复运气。我们的 XSLT 有两种功能:一种用于语法,另一种用于验证(我们的 XML 有点像脚本)。这两部分都提供了有意义的信息,在某些情况下可以用来重建损坏的信息。
      【解决方案3】:

      您可以通过设置一个其 XmlReaderSettings 包含架构的 XmlReader,然后使用它逐个节点地读取输入流来完成此操作。您可以跟踪读取的最后一个节点,并在发生验证错误时很好地了解您在文档中的位置。

      我认为如果你尝试这个练习,你会发现有很多验证错误(例如缺少必需的元素),其中错误节点的概念没有多大意义。是的,在这种情况下,父元素显然是错误的,但真正触发错误的是阅读器遇到了结束标签而没有看到所需的元素,这就是为什么错误线和位置指向结束标签的原因。

      【讨论】:

      • 那是另一回事。验证消息是非结构化的。是否有完整的验证消息列表。我正在考虑编写一个包装器来返回错误枚举或错误代码之类的内容。
      • 我从来没有找到过。在实践中,我从来不需要一个。模式的真正用例不是“验证实例文档并告诉我它有什么问题”,而是“指导我开发生成有效 XML 文档的流程”。
      【解决方案4】:

      我个人不知道如何获得更详细的错误,通常如果您打开文档并转到提到的位置,您可以轻松找到错误。

      如果代码无法将文件解析为有效的 XML,则很难给出 XPATH 或其他命名的 XML 详细信息。

      【讨论】:

        【解决方案5】:

        看来这不是一件容易的事。罗伯特罗斯尼的答案最接近于以编程方式解决我的问题,所以我现在会接受。我将继续使用 xsl 解决方案。任何找到解决验证错误的更好方法的人都可以回复此线程。

        【讨论】:

          猜你喜欢
          • 2016-02-23
          • 2013-05-22
          • 2011-04-19
          • 1970-01-01
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 2013-07-20
          • 2011-04-22
          相关资源
          最近更新 更多