设计XML Schema有两种不同的方法:
我的问题是:哪一个更好?
我发现第二个更好,因为它避免了深度嵌套并允许重用现有类型。它更接近软件工程的最佳实践。但我看到了this page,我现在很困惑:
以下是一些不要做的事。
- 不要试图成为XML Schema的主人。这需要几个月的时间。
- 请勿使用复杂类型,属性声明和注释。
- 请勿使用本地声明。
- 请勿使用替代组。
- 请勿在没有targetNamespace属性的情况下使用架构(AKA 变色龙图案。)
事实是,你不会因为跟随这些不要而失去任何东西 本文的其余部分将进行论证。
有一些解释,但我发现它们并不好。但可能我错过了一些东西......
准确地说,我会举例说明这两种方法。从W3Schools页面获取的示例。它列出了三种方法,但我忽略了第二种方法,因为它与第一种方法非常相似。
使用匿名complexTypes:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
使用命名的complexTypes:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
<xs:sequence>
<xs:element name="name" type="stringtype"/>
<xs:element name="address" type="stringtype"/>
<xs:element name="city" type="stringtype"/>
<xs:element name="country" type="stringtype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
<xs:sequence>
<xs:element name="title" type="stringtype"/>
<xs:element name="note" type="stringtype" minOccurs="0"/>
<xs:element name="quantity" type="inttype"/>
<xs:element name="price" type="dectype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
谢谢!
答案 0 :(得分:2)
具有名称的复杂类型比不具有名称的复杂类型更具可重用性。如果要以少量键入为代价来最大化可重用性,请为所有复杂类型命名。这是你的选择。
Kawaguchi的设计指南没有说明如何使用架构。如果您只想使用模式进行验证,那就是一件事;如果你想在C#或Java中使用它进行数据绑定,那就是另一个;如果你想用它来编写模式感知的XSLT和XPath,那又是另一组考虑因素。坦率地说,我发现他的建议有点肤浅。
答案 1 :(得分:2)
但我看到this page,我现在感到困惑......
不要让该页面影响您的决定。它大约十年前(2002年2月,根据Wayback Machine)写的,当时XML Schema是新的,可怕的外观和支持不足。我和作者一起做过简短的工作,并且知道他非常敏锐和务实;但是,我认为该文档针对的是那些发现XML Schema看起来很可怕并且支持得很差的人,并且给他们提供了一个使用XML Schema而且投资最少的备忘单。
答案 2 :(得分:1)
XML Schema满足各种可能的需求,例如数据绑定,类型安全处理,验证或接口定义。您的架构设计方法应该反映您的优先事项。
例如,命名类型对于高级用法很重要,例如,如果您想在XQuery或XSLT中利用模式感知XML处理,但如果您只需要用于验证的模式,则不太重要。