XML Schema设计方法

时间:2011-08-16 11:28:24

标签: xml xsd

设计XML Schema有两种不同的方法:

  1. 使用匿名complexTypes
  2. 使用命名的complexTypes
  3. 我的问题是:哪一个更好?


    我发现第二个更好,因为它避免了深度嵌套并允许重用现有类型。它更接近软件工程的最佳实践。但我看到了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>
    

    谢谢!

3 个答案:

答案 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处理,但如果您只需要用于验证的模式,则不太重要。