代码改变世界

Schema的一个简单实例

2006-04-25 17:35  Jeff  阅读(1402)  评论(0编辑  收藏  举报
一个XML文件如下:
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 联系人列表  SYSTEM "fclml.dtd">

<联系人列表 公司=“大地公司”>
    
<联系人>
        
<姓名>张三</姓名>
        
<ID>001</ID>
        
<公司>A公司</公司>
        
<EMAIL>zhang@aaa.com</EMAIL>
        
<电话>(010)62345678</电话>
        
<地址>
            
<街道>五街1234号</街道>
            
<城市>北京市</城市>
            
<省份>北京</省份>
            
<ZIP>100001</ZIP>
        
</地址>
    
</联系人>

    
<联系人>
        
<姓名>李四</姓名>
        
<ID>002</ID>
        
<公司>B公司</公司>
        
<EMAIL>li@bbb.org</EMAIL>
        
<电话>(021)87654321</电话>
        
<地址>
            
<街道>南京路9876号</街道>
            
<城市>上海</城市>
            
<省份>上海</省份>
            
<ZIP>200002</ZIP>
        
</地址>
    
</联系人>
</联系人列表>

它的DTD文件fclml.dtd如下:
<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
<!ATTLIST 联系人列表 
    公司 CDATA #REQUIRED
>

同样的文档结构要用Schema来描述的话,可写做下面的样子。我们给这个文件取名fclmlschema.xml。也许你要问:"为什么以.xml作为扩展名,而不象DTD那样有个特殊的名字?"答案很明确,因为Schema本身就是XML文档实例,以.xml作为扩展名正是为了强调这一点。不过,这并不是说,就只能以.xml作为扩展名。如果你愿意,你完全可以给它取一个全新的名字,比如:.aaa、.schema、...,只要你的文件系统支持就行。

[1]<?xml version="1.0" encoding="GB2312" ?>
[2]
<Schema xmlns="urn:schemas-microsoft-com:xml-data" 
               xmlns:dt
="urn:schemas-microsoft-com:datatypes">
[3]    
<AttributeType name="公司"/>
[4]    
<ElementType name= "姓名"/>
[5]    
<ElementType name= "ID"/>
[6]    
<ElementType name= "公司"/> 
[7]    
<ElementType name= "EMAIL"/>
[8]    
<ElementType name= "电话" dt:type="fixed.14.4"/>
[9]    
<ElementType name= "街道"/> 
[10]  
<ElementType name= "城市"/>
[11]  
<ElementType name= "省份"/>
[12]  
<ElementType name= "地址" content="eltOnly"> 
[13]       
<element type= "街道" /> 
[14]       
<element type= "省份" /> 
[15]       
<element type= "城市" />
[16]  
</ElementType>
[17]  
<ElementType name= "联系人" content="eltOnly">
[18]       
<element type= "姓名" />
[19]       
<element type= "ID" />
[20]       
<element type= "公司" />
[21]       
<element type= "EMAIL" />
[22]       
<element type= "电话" />
[23]       
<element type= "地址" />
[24]  
</ElementType>
[25]  
<ElementType name= "联系人列表" content="eltOnly">
[26]       
<element type= "联系人" />
[27]       
<attribute type="公司"/>
[28]  
</ElementType>
[29]
</Schema>

逐字逐句地分析一下这个fclmlschema.xml: 
 
        [1]是XML类型声明语句,指明该文档是一个XML文档,并且符合版本1.0规范。另外,该文档采用GB2312编码。
        [2]是Schema声明语句,它包含了Schema命名空间的声明。本例中用到了两个命名空间:一是xmlns="urn:schemas-microsoft-com:xml-data",它指定本文档是一个XML Schema文档;另一个是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定义了在本文档中可用的数据类型URI
        [3]是属性定义语句,它定义了属性“公司”。
        [4]-[11]是元素定义语句,这里共定义了8个元素:姓名、ID、公司、EMAIL、电话、街道、城市、省份。其中为"电话"元素定义了数据类型:fixed.14.4。
       [12]-[16]定义了本Schema的二级元素:地址,指明该元素包含三个子元素:街道、城市、省份。
[17]-[24]定义了本Schema的三级元素:联系人,它指明该元素包含六个子元素:姓名、ID、公司、EMAIL、电话、地址。
[25]-[28]定义了本Schema的顶级元素:联系人列表,指明该元素包含一个子元素:联系人,以及一个属性:公司。
[29]是结束标记语句,它指明该Schema的描述到此为止。