您可以为性能和准确性推荐哪些XML验证工具,每个工具都是我们系统的关键问题?我们有以下要求:
为什么不用xmllint? (这是背景,如果你愿意,你可以跳过它)
我们有一个大型的Perl系统,它使用RelaxNG来验证我们的XML。我们使用compact RelaxNG format和trang将其转换为标准的RelaxNG格式。然后我们通过xmllint进行实际验证。
这就是问题出现的时候.xmllint经常会错误地报告验证错误。它不会给出误报或否定,但如果文档无法验证,xmllint通常会报告给定错误的错误元素或属性。有时错误是正确的(“不希望看到元素'bar'),但仅仅是因为没有报告先前的错误(因为'bar'应该遵循必需但缺少的元素'foo',但xmllint不会'告诉我们这一点。请注意,这是xmllint长期存在的问题,即使是最新版本也存在同样的问题。我们经常会收到大量的XML文档,错误地报告错误会给客户和开发人员造成很大的麻烦。
答案 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包构建。事实是代码没有改变是由于代码是稳定的。没有报道错误。