zoukankan      html  css  js  c++  java
  • XML学习笔记(六)Schema语法之复杂类型

    Preface:本文是W3Schools上《Schema指南》的学习笔记。其中大部分内容是对指南的翻译总结。由于原文的例子更详尽生动,如果各位想阅读原文可以到这个网址http://www.w3schools.com/schema/default.asp。同时,W3Schools提供了测试,大家可以测试一下自己的理解程度。

            所谓的复杂类型Complex Type其实就是指ComplexElement。概括的说,包含有属性或其他元素的Element,就称为ComplexElement。ComplexElement可分为四种:

    • empty elements
      <product pid="1345"/>
      自闭合的Element,同时由于包含有Attribute的关系所以属于ComplexElement。

    • 只包含其他Elements的元素
      <employee>
      <firstname>John</firstname>
      <lastname>Smith</lastname>
      </employee>

    • 只包含Text的Element
      <food type="dessert">Ice cream</food>
      说明这里与SimpleElement不同的是,“type”是自定义的数据类型而且是一个ComplexType,而不是Schema内置的。同时这个Element是带有属性的。

    • 同时包含有其他Element和Text的元素
      <description>
      It happened on <date lang="norwegian">03.03.99</date> ....
      </description>

    一、概览ComplexElement

    定义一个ComplexElement
    例如在XML中有如下元素

    <employee>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    </employee>

    使用Schema定义就是

    <xs:element name="employee">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    注意这里的ComplexType不能被其他元素使用,所以如果要考虑重用,可以使用下面的方式。

    <xs:element name="employee" type="personinfo"/>
    <xs:complexType name="personinfo">
    <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType> 

    这里的格式与之前定义约束的时候很相似。不过约束是使用<xs:simpleType>定义的。

    重用已定义的ComplexElement
    说到重用,你还可以在现有的ComplexType基础上进行扩展,形成新的ComplexType。如下:

    <xs:element name="employee" type="fullpersoninfo"/>

    <xs:complexType name="personinfo">
    <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>

    <xs:complexType name="fullpersoninfo">
    <xs:complexContent>
    <xs:extension base="personinfo">
    <xs:sequence>
    <xs:element name="address" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="country" type="xs:string"/>
    </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    注意关键的是用“base”属性指出是对哪个元素进行扩展。这里fullpersioninfo将包含firstname,lastname,address,city,country的信息。

    二、Empty Element

    有一个EmptyElement如下

    <product prodid="1345" /> 

    那么使用定义应为

    <xs:element name="product">
    <xs:complexType>
    <xs:attribute name="prodid" type="xs:positiveInteger"/>
    </xs:complexType>
    </xs:element> 

    注意,你仍然可以使用“name”属性为complexType指定名称,然后在element中使用“type”属性指定类型。从而能够在多个element中使用这个类型定义。

    三、Elements Only

    以下的ComplexType是只包含其他元素的。

    <person>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    </person> 

    在Schema中定义如下

    <xs:element name="person">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    这里要注意的是<xs:sequence>的意义,是指里面包含的元素(firstname,lastname)在XML中(person)必须按照定义的顺序出现。

    四、Complex Text-Only Elements

    <shoesize country="france">35</shoesize>
    定义如下

    <xs:element name="shoesize">
    <xs:complexType>
    <xs:simpleContent>
    <xs:extension base="xs:integer">
    <xs:attribute name="country" type="xs:string" />
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    </xs:element> 

    这里要注意的是由于Element包含简单的内容和属性,所以要使用<xs:simpleContent>将其括住。同时,因为使用了<xs:simpleContent>就必须定义一个扩展(extension)或约束(restriction)。

    五、同时包含有其他Element和Text的元素(mix属性)

    <letter>
    Dear Mr.
    <name>John Smith</name>.
    Your order 
    <orderid>1032</orderid>
    will be shipped on 
    <shipdate>2001-07-13</shipdate>.
    </letter>

    <xs:element name="letter">
    <xs:complexType mixed="true">
    <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="orderid" type="xs:positiveInteger"/>
    <xs:element name="shipdate" type="xs:date"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    注意,由于有字符出现在元素之间,所以要设定complexType的mixed属性为true。

    本文为个人原创,转载请注明出自:http://jackma.cnblogs.com/
    Author:JackMa

  • 相关阅读:
    自己写的一个后台模板
    php计算登陆时间差
    友盟推送,php简单代码
    rolling_curl curl批量采集函数留份
    PHP socket服务框架
    JS 画饼图,折线图
    jquery 日期插件
    JS 获取当前页面url,及锚点
    PHP 读取文件,返回二进制流
    各个数据库DataSource配置文件
  • 原文地址:https://www.cnblogs.com/JackMa/p/1211179.html
Copyright © 2011-2022 走看看