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

      关于XML的基础知识一直都是读的 http://www1.xml.net.cn/那本初学进阶,讲的非常容易懂,就是关于命名空间这一块没有给出一个比较好的例子,所以自己整理了一下。
      初学进阶里面说命名空间是用于在一个XML里面引入多个DTD的,的确,概念上是这样子的,不过网上的资料显示XML的命名空间并不支持DTD格式的格式定义,也就是说,想实现一个XML当中有多个文档格式的话,就必须要使用Schema。
      先了解一下我们要实现的例子:
      
client.xml
< 联系人列表 >
  
< 联系人 >
    
< 姓名 > 张三 </ 姓名 >
    
< ID > 001 </ ID >
    
< 公司 > A公司 </ 公司 >
    
< EMAIL > [email protected] </ 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 > [email protected] </ 联系人: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来做个测试。

你可能感兴趣的:(java,xml)