RelaxNG与XML Schema的区别

27

我有一个项目,其中我正在使用RelaxNG (jing)来验证xml。我喜欢RelaxNG的语法,但我拥有的大多数工具都使用XML schema(实际上,除了jing之外,我不认为我有其他使用RelaxNG的工具)。如果大多数支持都是围绕XML schema展开,那么在使用RelaxNG时是否会犯设计和未来支持方面的错误呢?我应该坚持使用RelaxNG并让其他人学习它(必要时进行踢腿和尖叫,开个玩笑)?还是应该因为工具支持而切换到XML schema?

谢谢。


4
libxml2(例如 xmllint 命令行工具)支持 RelaxNG。 - reinierpost
5个回答

19
答案有点老生常谈:这取决于情况。
你可能会问,取决于什么?取决于你的用户可能使用的工具。如果你依赖于你的用户,如果缺乏好的工具将导致他们离开,你可能会失去他们。从我的经验来看,由于XML模式被广泛使用,因此您可能需要重新考虑是否继续使用Relax NG。它比XML模式更好,更容易理解,但这并不意味着它会使您的项目成功。
如果您想冒一点险,请使用Relax NG。在开发的每个步骤中,尝试使用Trang等工具将Relax NG转换为XML模式。以防有一天您认为Relax NG不值得,而您知道自己有一个合理的备份。

1
好的回答。Jing 的另一个问题是支持水平。 Jing/Trang 的一些代码已经几年没有更新了。 - jmq
4
值得指出的是,Jing和Trang现在正在重新开发中。 - Nic Gibson
2
此外,jing中几乎没有什么错误;James Clark犯的错误比典型程序员少得多。Trang在XSD输出方面存在问题,但其他方面也相当正确。指标“如果它不改变,就死了”并不适用于这种代码质量。 - John Cowan
@JohnCowan 我不禁怀疑,XSD输出的这些问题更多是由于XSD本身就是一个混乱的大杂烩所致。 - SamB

8

我认为这取决于你需要使用架构的具体内容。

还有一点:如果您只需要验证,那么就使用RelaxNG:它非常适合此目的。

但是,如果您计划执行数据绑定(例如JAXB)或其他类型的代码生成任务,则XML Schema是(不幸的是…)更好的选择,因为它更适用于对象与XML之间的转换,而不是RelaxNG。相反,它并不是很适合XML验证;特别是考虑到增加的复杂性。实际上,可以称XML Schema为XML的类型系统,而不是模式。


8

我们通常会先写一些稍微有限的RELAX NG格式,然后使用Trang自动转换成XSD格式(我们从不修改或查看XSD格式),这种方法对我们非常有效。


1
我应该补充说明的是,我们总是确保至少有一个文档针对 XSD 进行验证(jing 将使用 Xerces 在底层执行此操作),以确保 Trang 未生成具有 UPA 违规或其他 XSD 错误的 XSD,因为有时它会这样做。 - John Cowan

7

一切取决于你需要说服谁。您的分析是非常正确的:RelaxNG是更好的验证语言,但它的工具支持要少得多。那么你实际上需要哪些工具呢?


将trang转换为XSD,以便于所有基于XSD的工具使用。 - Susanne Oberhauser

2
也是另一个合理的选择,它具有基于强大XPath的验证功能...

然而,我的团队通常使用Relax/NG compact构建所有内容(因为易读性更好),并根据需要转换为XSD(例如基于库的验证),否则忽略XSD。

:)

这很有效。


我们使用Schematron作为附加模式,而不是RELAX NG或XSD的替代品。 Schematron在提供场景(称为阶段)方面非常出色,我们使用它来指定特定的内容条件。例如,如果您必须处理某些重要属性可能在极端情况下丢失的情况,则必须在主(RELAX NG或XSD)模式中允许该情况,但可以提供Schematron阶段“缺少内容”和另一个“内容存在”,以确保您的样本在这些不同的情况下表现良好。 - Jan Vlcinsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接