随笔 - 14, 文章 - 0, 评论 - 15, 引用 - 0
数据加载中……

学习java&XML第二天,命名空间

      关于XML的基础知识一直都是读的http://www1.xml.net.cn/那本初学进阶,讲的非常容易懂,就是关于命名空间这一块没有给出一个比较好的例子,所以自己整理了一下。
      初学进阶里面说命名空间是用于在一个XML里面引入多个DTD的,的确,概念上是这样子的,不过网上的资料显示XML的命名空间并不支持DTD格式的格式定义,也就是说,想实现一个XML当中有多个文档格式的话,就必须要使用Schema。
      先了解一下我们要实现的例子:
      
client.xml
<联系人列表>
  
<联系人>
    
<姓名>张三</姓名>
    
<ID>001</ID>
    
<公司>A公司</公司>
    
<EMAIL>zhang@aaa.com</EMAIL>
    
<电话>(010)62345678</电话>
    
<地址>
      
<街道>五街1234号</街道>
      
<城市>北京市</城市>
      
<省份>北京</省份>
    
</地址>
    
<直接上司>
      
<姓名>王五</姓名>
      
<电话>
        
<秘书电话>(010)62345678</秘书电话>
        
<手机>13601234567</手机>
      
</电话>
    
</直接上司>
  
</联系人>
</联系人列表>

      以上是我们想要最终表达的数据格式,其中,联系人的直接上司属性有点麻烦,因为整个直接上司表达的是一个“企业经理”的“对象”,该“对象”可以以另外的XML形式体现,如下:

<?xml version="1.0" encoding="GB2312"?>
<企业经理>
  
<姓名>王五</姓名>
  
<电话>
    
<秘书电话>(010)62345678</秘书电话>
    
<手机>13601234567</手机>
  
</电话>
</企业经理>

      看以上的两个文档,实际上就是我们想表达的数据,两个抽象的实体“联系人”和“企业经理”之间存在着一对一的关系。
      但是我们现在有个麻烦,在联系人列表这个XML当中,有两个“姓名”元素和两个“电话”元素,他们表达的是不同的意思,其文档格式定义也不同。他们分别对应着不同的DTD或者是Schema。
      为了解决这一问题,就有了命名空间的概念,首先,对于我们要最终作用于其上的client.xml,他必须首先区别联系人和企业经理,做法就是在前面加前缀,比如联系人的名字改为“联系人:名字”而企业经理的名字则改为“企业经理:名字”
      其次,两个不同的文档定义文件必须首先定义好命名空间,在作用于XML文件的时候,使命名空间和XML声明中的命名空间一致
      下面分别给出例子代码:
      client.xml:
<?xml version="1.0" encoding="GB2312"?>
<联系人:联系人列表 
xmlns:联系人
="id" 
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation
="id client.xsd id2 manager.xsd"
xmlns:企业经理
="id2">
    
<联系人:联系人>
        
<联系人:姓名>张三</联系人:姓名>
        
<联系人:ID>001</联系人:ID>
        
<联系人:公司>A公司</联系人:公司>
        
<联系人:EMAIL>zhang@联系人.com</联系人:EMAIL>
        
<联系人:电话>(010)62345678</联系人:电话>
        
<联系人:地址>
            
<联系人:街道>五街1234号</联系人:街道>
            
<联系人:城市>北京市</联系人:城市>
            
<联系人:省份>北京</联系人:省份>
        
</联系人:地址>
        
<联系人:直接上司>
            
<企业经理:姓名>王五</企业经理:姓名>
            
<企业经理:电话>
              
<企业经理:秘书电话>(010)62345678</企业经理:秘书电话>
              
<企业经理:手机>13601234567</企业经理:手机>
            
</企业经理:电话>
        
</联系人:直接上司>
    
</联系人:联系人>
    
<联系人:联系人>
        
<联系人:姓名>李四</联系人:姓名>
        
<联系人:ID>002</联系人:ID>
        
<联系人:公司>B公司</联系人:公司>
        
<联系人:EMAIL>li@bbb.org</联系人:EMAIL>
        
<联系人:电话>(021)87654321</联系人:电话>
        
<联系人:地址>
            
<联系人:街道>南京路9876号</联系人:街道>
            
<联系人:城市>上海市</联系人:城市>
            
<联系人:省份>上海</联系人:省份>
        
</联系人:地址>
        
<联系人:直接上司>aa</联系人:直接上司>
    
</联系人:联系人>
</联系人:联系人列表>

      client.xsd:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id" targetNamespace="id" elementFormDefault="qualified">
    
<xs:element name="EMAIL" type="xs:string"/>
    
<xs:element name="ID" type="xs:string"/>
    
<xs:element name="公司" type="xs:string"/>
    
<xs:element name="地址">
        
<xs:complexType>
            
<xs:sequence>
                
<xs:element ref="街道"/>
                
<xs:element ref="城市"/>
                
<xs:element ref="省份"/>
            
</xs:sequence>
        
</xs:complexType>
    
</xs:element>
    
<xs:element name="城市" type="xs:string"/>
    
<xs:element name="姓名" type="xs:string"/>
    
<xs:element name="电话" type="xs:string"/>
    
<xs:element name="省份" type="xs:string"/>
    
<xs:element name="联系人">
        
<xs:complexType>
            
<xs:sequence>
                
<xs:element ref="姓名"/>
                
<xs:element ref="ID"/>
                
<xs:element ref="公司"/>
                
<xs:element ref="EMAIL"/>
                
<xs:element ref="电话"/>
                
<xs:element ref="地址"/>
                
<xs:element ref="直接上司"/>
            
</xs:sequence>
        
</xs:complexType>
    
</xs:element>
    
<xs:element name="联系人列表">
        
<xs:complexType>
            
<xs:sequence>
                
<xs:element ref="联系人" maxOccurs="unbounded"/>
            
</xs:sequence>
        
</xs:complexType>
    
</xs:element>
    
<xs:element name="街道" type="xs:string"/>
    
<xs:element name="直接上司" type="xs:anyType"/>
</xs:schema>

      manager.xsd:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!--W3C Schema generated by XMLSpy v2005 sp1 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="id2" targetNamespace="id2" elementFormDefault="qualified">
    
<xs:element name="企业经理">
        
<xs:complexType>
            
<xs:sequence>
                
<xs:element ref="姓名"/>
                
<xs:element ref="电话"/>
            
</xs:sequence>
        
</xs:complexType>
    
</xs:element>
    
<xs:element name="姓名" type="xs:string"/>
    
<xs:element name="手机" type="xs:string"/>
    
<xs:element name="电话">
        
<xs:complexType>
            
<xs:sequence>
                
<xs:element ref="秘书电话"/>
                
<xs:element ref="手机"/>
            
</xs:sequence>
        
</xs:complexType>
    
</xs:element>
    
<xs:element name="秘书电话" type="xs:string"/>
</xs:schema>

说明:我在这里用id和id2来表示命名空间是应为很多人会认为那个命名空间的网址会在解析XML的时候被访问,我一开始也这样认为,所以改成id来做个测试。

posted on 2005-03-08 17:32 Boris-Java 阅读(1013) 评论(0)  编辑  收藏 所属分类: java&xml


只有注册用户登录后才能发表评论。


网站导航: