使用RelaxNG进行XML模式验证

时间:2008-11-03 12:12:30

标签: xml perl validation schema relaxng

您可以为性能和准确性推荐哪些XML验证工具,每个工具都是我们系统的关键问题?我们有以下要求:

  • 不是 xmllint(见下文)
  • 支持RelaxNG
  • 可以轻松地与Perl集成(这是可选的,但它会很好)

为什么不用xmllint? (这是背景,如果你愿意,你可以跳过它)

我们有一个大型的Perl系统,它使用RelaxNG来验证我们的XML。我们使用compact RelaxNG formattrang将其转换为标准的RelaxNG格式。然后我们通过xmllint进行实际验证。

这就是问题出现的时候.xmllint经常会错误地报告验证错误。它不会给出误报或否定,但如果文档无法验证,xmllint通常会报告给定错误的错误元素或属性。有时错误是正确的(“不希望看到元素'bar'),但仅仅是因为没有报告先前的错误(因为'bar'应该遵循必需但缺少的元素'foo',但xmllint不会'告诉我们这一点。请注意,这是xmllint长期存在的问题,即使是最新版本也存在同样的问题。我们经常会收到大量的XML文档,错误地报告错误会给客户和开发人员造成很大的麻烦。

5 个答案:

答案 0 :(得分:14)

我认为JDrago有正确的想法,你需要避免使用基于libxml2的工具进行RNG验证,至少目前是这样。我在我的项目中也发现了这一点。我最近针对libxml2记录了两个关于RNG验证的错误。

我建议jing。它由Relax NG的创建者James Clark编写,他是XML世界的主要亮点之一。他也是你已经使用的trang的作者。最近在我链接到上面的Google Code网站上恢复了此代码(和trang)的开发。

Jing已证明我们的内容和架构始终是正确的,并提供比libxml2更好的错误消息,尽管在这方面仍有很大的改进空间。

与libxml2 / xmllint相比,jing的一个缺点是它目前不使用OASIS XML目录来解析指向模式的公共和系统标识符和URI。如果您包含了由'http'URI引用的模式,那么这将是一个问题 - 这些模式将始终通过网络获取。

答案 1 :(得分:3)

Hamcrest Schema允许您使用Hamcrest Matchers针对RelaxNG验证XML文档。

答案 2 :(得分:2)

我怀疑xmllint使用相同的底层库(libxml2等)。认为同一个库的另一个前端会产生不同的结果是违反直觉的。

答案 3 :(得分:2)

rnv非常快,免费(如在言论自由中)并在命令行上运行(因此Perl可以轻松调用它)。大多数情况下,消息都可以。不幸的是,它似乎不再维持。

答案 4 :(得分:2)

我是RNV的作者。它在sourceforge.net上维护,并且有一个维护者负责sourceforge和debian包构建。事实是代码没有改变是由于代码是稳定的。没有报道错误。