我遇到了这个W3C XML Schema: DOs and DON'Ts列表,而DO NOT use complex types部分让我感到惊讶。
我在使用<xs:complexType name="SomeNewType">
时没有遇到任何问题,我不明白为什么使用<xs:group name="someNewElement">
比使用complexType更好。
是否真的需要避免使用complexType?
如果是这样,为什么?有什么问题呢?
应该使用什么?
答案 0 :(得分:2)
对于几乎任何足够复杂和强大而有趣的语言,不同的人会对使用该语言的最佳方式有不同的看法。
你问“应该避免使用complexType吗?”正如您所见,在文档中您指向Kohsuke Kawaguchi(他是设计XSD的工作组的成员,并编写了几个重要的XSD工具,包括首批XSD验证器之一),建议用户避免在XSD中使用某些构造,包括complexType,往往是因为它们的优点与其缺点(特别是:它们的复杂性)的比例很差。你可以(实际上你必须)对KK论证的说服力做出自己的想法。
因为(据我所知)你的问题相当于问“KK是对的吗?”,我认为你不会觉得自己完全放心,或者至少你很好奇并希望知道别人的想法。
一般来说,可以肯定地说,许多XSD用户和许多XSD工具的创建者都不同意KK。他们发现从其他复杂类型派生复杂类型的能力很有帮助,并且他们使用它。
同样可以肯定地说,许多其他人同意KK认为XSD的这种或那种结构太复杂并且更好地避免。有些人会这样写出描述“最佳实践”的文档,这些文档规定了构造要使用和构造以避免;有时这些文件的内容是有用的,有时不是。许多最热切地同意KK关于XSD复杂类型的人在他们可以避免这样做时根本不使用XSD:他们更喜欢Relax NG(或者在某些情况下,DTD或Schematron)。
换句话说:合格观察员的意见与不合格观察员的观点不同。我知道一些非常聪明的人在这个问题上不同意KK。我也知道KK本人和一些同意他的人也非常聪明。我无意在这里选择一方。
最后,你问如果它有问题,为什么它首先存在于语言结构中?任何语言的任何构造都存在,因为设计该语言的人认为值得包括。对于XSD和复杂类型,这意味着:复杂类型在XSD中作为可命名对象,因为基本上负责工作组中的每个人都希望使用该语言。这并不妨碍他们出现问题:像其他人一样,技术娴熟的人可能会犯错误,必须寻求共识的团体可以在适当的情况下制作出没有人真正喜欢的设计(但每个人都喜欢这种设计)根本没有问题的构造;有时妥协是完成某事的唯一方法。
我希望这会有所帮助。