【问题标题】:Validating XML Docs Against a Wide Array of Constraints针对各种约束验证 XML 文档
【发布时间】:2009-07-15 04:41:55
【问题描述】:

我需要针对各种约束验证 XML 文件:元素文本的类型和/或格式、共现、日期比较和日期数学,以及来自数据库的一些用户定义规则(即元素 X 可以仅包含子元素 A、B 和 C),我不知道该怎么做。

这个应用程序的当前版本通过 Perl 强制执行这些约束,因为我觉得 Perl 代码复制了许多我可以使用 XSD 或 RELAX NG 开箱即用的功能。 不幸的是,使用其中任何一个都会导致错误消息对最终用户来说是神秘的。将这些神秘的信息映射到友好的东西似乎是不可能的(除了提供行/列号)。

然后是 Schematron。它允许我生成友好的消息并检查上述模式语言不能的约束。不幸的是,类型/格式检查和日期数学成为大型 XSLT 模板黑客。

现在我不知道该怎么办了。

Schematron 和 RELAX NG 之间的组合似乎是最好的方法,但是 RELAX NG 产生的错误使得无法向最终用户提供任何信息。

我曾希望使用一个主架构模板,该模板将根据数据库中的自定义规则进行修改。

是保持原始方法最好,还是应该继续使用 Schematron/RELAX NG 并将格式/类型强制转换为 XSLT 模板?

【问题讨论】:

  • 错误不是“由 RELAX NG 提供的”,它们是由特定的实现提供的。你用的是哪一个?

标签: xml schema xsd


【解决方案1】:

实际上,在我看来,您的任务确实不是 XML 验证,也不应该被强制执行。

您的描述看起来像是对包含在 XML 文档中的数据进行了许多特定于域甚至特定于环境的验证,而不是真正的 XML 文档本身。因此,我想说,在代码中编写一个验证器来解析文档并应用您复杂的、数据驱动的验证套件。我怀疑您将能够向用户提供更好的反馈,因为您的代码将具有该领域的语义知识。

我想你可以使用 XML 模式系统作为这样一个系统的“第一遍”,但是如果最终你需要解析和加载数据,我通常发现模式验证没有添加任何东西,因为解析的代码无论如何都必须验证。

【讨论】:

  • 域是 XML 文档。好吧,有用户定义的规则,但它们只占整体需求的一小部分。验证用于强制执行一些我无法控制的复杂 XML 规范。如果给定的实例文档通过,它将被发送出去,再也不会被听到。如果失败,则会更正并发送。这些规则没有其他用途。
  • 也许我们对您的情况了解不够。 “日期比较和日期数学”和“来自数据库的一些用户定义规则”听起来都不是标准 XML 验证语言的好候选。我现在了解您不需要加载数据以用于其他用途。所以,我认为两遍方法可能是最好的:使用 XML 验证(无论哪种模式似乎最简单),然后解析文档并执行数据检查(如日期数学)。
猜你喜欢
  • 2017-05-07
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2018-07-11
  • 2015-07-02
相关资源
最近更新 更多