网友俱乐部 » » XML教程 » 3.2.2.3 用Schema定义元素及其内容

2007-2-25 17:37 hinet
3.2.2.3 用Schema定义元素及其内容

3.2.2.3 用Schema定义元素及其内容
   

在讲述Schema中和ETD定义相对应的种种定义方法之前,我们先来看看所涉及的三个Schema元素:ElementType、element、group。
ElementType元素
在Schema文档中使用ElementType来声明XML文件中会出现的元素,ElementType的语法表达如下:
    name="元素名"
    content="{ empty | textOnly | eltOnly | mixed }"
    dt:type="元素类型"
    order="{ one | seq | many }"
    model="{ open | closed }"
>
在ElementType的几个属性中,name的含义不言而喻,是所声明元素的名称,它是不可缺少的。content是ElementType的一个重要属性,它指明ElementType所声明的元素是否为空、是否包含文本、是否包含子元素、还是既包含文本又包含子元素。dt:type指定该元素的数据类型,我们会在后面的小节中详细讨论。order指定该元素的子元素的排列顺序规则。最后,model指定该元素是否可以包含未在本Schema中定义的元素和属性,它主要用于其它Schema的引入,也就是其它“命名空间”的引入。“命名空间”的概念大家可能还比较生疏,这是我们下一节要讲的内容,现在你只要了解,在一个XML文件中能够同时使用几个不同的DTD或Schema定义。下表列出了model可能的取值。
取 值 释  意

open 表明该元素可以包含其它未在XML Schema中定义的元素和属性
closed 表明该元素只能包含在本XML Schema中定义过的元素和属性
缺省状态下,XML Schema的model取值"open",也就是说,该元素可以包含其它未在XML Schema中定义的元素和属性。但是,这并不意味着任何元素和属性都可在Schema中出现,允许出现的前提是这些"异类"元素和属性必须在单独的XML Schema中加以定义,并且必须在引用的它们的元素中以命名空间形式指定其出处。下面给出一个具体的示例。
<联系人>
        <姓名>张三
        001
        <公司>A公司
        [email]zhang@aaa.com[/email]
        <电话>(010)62345678
        <传真 xmlns="fax.xml">(010)62345678
        <地址>
            <街道>五街1234号
            <城市>北京市
            <省份>北京
            100001
        

本来fclmlschema.xml中并没有定义"传真"元素,但如果将"联系人"元素的的"model"属性设为"open",就可以在"联系人"中引用它,当然还必须指定"传真"元素所在的Schema文件"fax.xml"。"open"体现了XML Schema的可扩展性,而这是DTD所无法比拟的。
element元素
ElementType只是起到声明元素的作用,至于元素的内容究竟是什么,则要靠它的子元素element来说明。element的语法表达如下:
    type="元素类型"
    [minOccurs="{ 0 | 1 }"]
    [maxOccurs="{ 1 | * }"]
>
element实际上是对该Schema中ElementType声明的引用,而具体引用什么元素类型,就要靠type属性指定了。type属性不可缺少,并且为了保证type指定的是已经声明过的元素,要求它的取值必须同某个ElementType中的name属性严格一致。至于其它两个属性倒是可有可无。minOccurs指定该元素在其父元素中出现的最小次数,缺省值为1,表明该元素至少出现一次;也可以取值为0,表明该元素是可选的,可以不出现。maxOccurs则指定了该元素出现的最大次数,缺省值同样为1,表明该元素至多出现一次;也可取值为“*”,表明该元素在XML实例文档中出现次数不受限制。
group元素
DTD中有成组的概念,相应的,Schema中也有“group”元素。它的语法表达类似element元素:
    order="{one | seq | many}"
    [minOccurs="{ 0 | 1 }"]
    [maxOccurs="{ 1 | * }"]
>
和DTD的规定相同,组里的内容可以是元素,也可以是另一个子组。属性order指定该组中的元素或子组的顺序,minOccurs和maxOccurs分别指定了该组在其父元素中出现的最小次数和最大次数。
下面,我们就开始对DTD和Schema对相同内容的不同定义方式进行一次大比较!
表现内容 DTD Schema 合法实例
空元素 <ELEMENT a EMPTY>
字符串 <ELEMENT a (#PCDATA)>
abcdefg




一个子元素 <ELEMENT a (b)>
   
  

有顺序的
子元素 <ELEMENT a (b, c)>
  
   
  
  

OR或 <ELEMENT a (b | c)>
   
   
  

  

任意顺序(或不出现)的子元素 <ELEMENT a (b | c)*>
   
   

  

  


  
  

  
  

可选子元素 <ELEMENT a (b?)>
   
  

"+"型重复元素 <ELEMENT a (b+)>
   
  

  
  

"*"型重复元素 <ELEMENT a (b*)>
   
  

  
  

成组元素 <ELEMENT a (b,c)+>
  
      
        
   

  
  

  
  
  
  

混合元素 <ELEMENT a (#PCDATA | b | c)*>   
  
   
abcdefg

  abcdefg
  


  
  abcdefg
  

  abcd
  
  efg

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.