科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道理解XML Schema: XML Schema 初步

理解XML Schema: XML Schema 初步

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文章系列是XML Schema的一个从入门到进阶的基本教程。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共7页)

匿名类型定义


    使用XML Schema,我们能够通过定义一系列具有名称的类型,如PurchaseOrderType类型,然后声明一个元素,比如purchaseOrder,通过使用"type="这样的构造方法来应用类型。这种类型的模式构造非常直截了当,但有些不实用。特别是,如果你定义了许多只应用一次而且包含非常少约束的类型,在这些情况下,一个类型应该能够被更简单的定义。这样的简单定义通常的形式是一个节省了名称和外部引用开销的匿名类型。

    在po.xsd(参见下图)中类型Items的定义中,有两个元素声明使用了匿名类型定义,它们是item和quantity.一般的来说,你能够通过元素中是否包含"type="这个属性来判断匿名元素定义(或者是匿名属性定义),而另方面,如果出现无名称的类型定义也可以认为是匿名元素(属性)定义。

<xsd:complexType name="Items">
 <xsd:sequence>
  <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:element name="productName" type="xsd:string"/>
     <xsd:element name="quantity">
      <xsd:simpleType>
       <xsd:restriction base="xsd:positiveInteger">
        <xsd:maxExclusive value="100"/>
       </xsd:restriction>
      </xsd:simpleType>
     </xsd:element>
     <xsd:element name="USPrice"  type="xsd:decimal"/>
     <xsd:element ref="comment"   minOccurs="0"/>
     <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="partNum" type="SKU" use="required"/>
   </xsd:complexType>
  </xsd:element>
 </xsd:sequence>
</xsd:complexType>
 


   在item元素中,它被定义为一个复合匿名类型,该复杂类型是由productName、quantity、USPrice、comment、shipDate元素和一个称为partNum的属性组成的。在quantity元素中,他有一个简单匿名类型,从integer类型中引出,他的值范围为1到99。


元素内容


    购买订单的模式文档中包含了很多元素类型定义的例子:有元素包含其他元素的(如items),有元素包含其他元素和属性的(如shipTo)以及元素包含一个简单类型值的(如USPrice)。然而,我们没有看见包含了属性并且只包含一个简单类型值的元素,也没有看见包含了其他元素,同时也有文本内容,两者混在一起的元素,也没有看见更本不包含内容的元素。在本节,我们将要看看元素的内容模型的这些变化。


从简单类型到复合类型


    让我们首先考虑一下,如何声明包含了一个属性,同时拥有简单类型值的元素。在一个实例文档中,此类的元素就像下面的形式: <internationalPrice currency="EUR">423.46</internationalPrice>

    让我们从购买订单模式文档中的USPrice元素声明开始: <xsd:element name="USPrice" type="decimal"/>

    现在我们如何为这个元素定义添加一个属性呢? 我们以前说过,简单类型不能有属性,而decimal是简单类型。因此,我们必须定义一个复合类型来携带属性声明。然而,同时我们也想具有简单类型decimal的元素内容。所以我们最初的问题转化为:我们如何定义一个基于简单类型decimal的复合类型? 答案是,从简单类型decimal中引出一个新的复合类型(参见下图)。

<xsd:element name="internationalPrice">
  <xsd:complexType>
   <xsd:simpleContent>
    <xsd:extension base="xsd:decimal">
     <xsd:attribute name="currency" type="xsd:string"/>
    </xsd:extension>
   </xsd:simpleContent>
  </xsd:complexType>
 </xsd:element>
 


    我们使用complexType 元素来开始定义一个新的(匿名的)类型。为了表示新类型的内容模型只包括字符数据而没有元素,我们使用simpleContent元素来实施定义。最后,我们通过扩展简单的decimal类型引出新的类型。扩展包括使用标准属性声明来添加一个currency属性。


混合内容


    购买订单模式文档的构造也许会被特征化为元素包含子元素、并且最深的子元素包含字符数据。当然,XML Schema也为模式文档的构造提供了另一类支持:字符数据可以和子元素同时出现,也就是说字符数据并不是被限制在最深的元素中。

    为了显示这点,考虑下面的这个使用XML表示的客户信笺的片断,该片断包含了一些购买订单相同的元素(参见下图)。

<letterBody>
<salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
Your order of <quantity>1</quantity> <productName>Baby
Monitor</productName> shipped from our warehouse on
<shipDate>1999-05-21</shipDate>. ....
</letterBody>
 


    请注意在元素之间的文本和他们的子元素。在这里,文本出现在元素salutation、quantity、productName和shipDate之间,这些元素都是LetterBody的子元素。并且在letterBody孙子元素name旁边也有文本出现。

<xsd:element name="letterBody">
 <xsd:complexType mixed="true">
  <xsd:sequence>
   <xsd:element name="salutation">
    <xsd:complexType mixed="true">
     <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element>
   <xsd:element name="quantity"    type="xsd:positiveInteger"/>
   <xsd:element name="productName" type="xsd:string"/>
   <xsd:element name="shipDate"    type="xsd:date" minOccurs="0"/>
   <!-- etc. -->
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>
 
    出现在客户信笺中的元素是使用我们先前看到的element 和complexType元素构造来声明的,他们的类型也是用这种方法定义的(参见上图)。

    注意到在XML Schema中,混合模型与XML 1.0的混合模型有着根本的区别。在XML Schema下面的混合模型,子元素在一个实例中出现的顺序和数量必须与子元素在模型中说明的顺序和数量一致。与之相对,在XML1.0混合模型下,出现在实例中的子元素的顺序和数量不能被限制。总而言之,XML Schema提供了充分的混合模型的校验而XML1.0只提供了部分的模式校验。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章