关于XML的基础知识一直都是读的 http://www1.xml.net.cn/那本初学进阶,讲的非常容易懂,就是关于命名空间这一块没有给出一个比较好的例子,所以自己整理了一下。
      初学进阶里面说命名空间是用于在一个XML里面引入多个DTD的,的确,概念上是这样子的,不过网上的资料显示XML的命名空间并不支持DTD格式的格式定义,也就是说,想实现一个XML当中有多个文档格式的话,就必须要使用Schema。
      先了解一下我们要实现的例子:

None.gifclient.xml
< 联系人列表 >
None.gif   < 联系人 >
None.gif     < 姓名 > 张三 </ 姓名 >
None.gif     < ID > 001 </ ID >
None.gif     < 公司 > A公司 </ 公司 >
None.gif     < EMAIL > zhang@aaa.com </ EMAIL >
None.gif     < 电话 > (010)62345678 </ 电话 >
None.gif     < 地址 >
None.gif       < 街道 > 五街1234号 </ 街道 >
None.gif       < 城市 > 北京市 </ 城市 >
None.gif       < 省份 > 北京 </ 省份 >
None.gif     </ 地址 >
None.gif     < 直接上司 >
None.gif       < 姓名 > 王五 </ 姓名 >
None.gif       < 电话 >
None.gif         < 秘书电话 > (010)62345678 </ 秘书电话 >
None.gif         < 手机 > 13601234567 </ 手机 >
None.gif       </ 电话 >
None.gif     </ 直接上司 >
None.gif   </ 联系人 >
None.gif </ 联系人列表 >

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

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

   看以上的两个文档,实际上就是我们想表达的数据,两个抽象的实体“联系人”和“企业经理”之间存在着一对一的关系。


      但是我们现在有个麻烦,在联系人列表这个XML当中,有两个“姓名”元素和两个“电话”元素,他们表达的是不同的意思,其文档格式定义也不同。他们分别对应着不同的DTD或者是Schema。


      为了解决这一问题,就有了命名空间的概念,首先,对于我们要最终作用于其上的client.xml,他必须首先区别联系人和企业经理,做法就是在前面加前缀,比如联系人的名字改为“联系人:名字”而企业经理的名字则改为“企业经理:名字”


      其次,两个不同的文档定义文件必须首先定义好命名空间,在作用于XML文件的时候,

使命名空间和XML声明中的命名空间一致

      下面分别给出例子代码:

      client.xml:

None.gif <? xml version="1.0" encoding="GB2312" ?>
None.gif < 联系人: 联系人列表 
None.gifxmlns:联系人 ="id"  
None.gifxmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  
None.gifxsi:schemaLocation ="id client.xsd id2 manager.xsd"
None.gifxmlns:企业经理 ="id2" >
None.gif     < 联系人: 联系人 >
None.gif         < 联系人: 姓名 > 张三 </ 联系人:姓名 >
None.gif         < 联系人:ID > 001 </ 联系人:ID >
None.gif         < 联系人: 公司 > A公司 </ 联系人:公司 >
None.gif         < 联系人:EMAIL > zhang@联系人.com </ 联系人:EMAIL >
None.gif         < 联系人: 电话 > (010)62345678 </ 联系人:电话 >
None.gif         < 联系人: 地址 >
None.gif             < 联系人: 街道 > 五街1234号 </ 联系人:街道 >
None.gif             < 联系人: 城市 > 北京市 </ 联系人:城市 >
None.gif             < 联系人: 省份 > 北京 </ 联系人:省份 >
None.gif         </ 联系人:地址 >
None.gif         < 联系人: 直接上司 >
None.gif             < 企业经理: 姓名 > 王五 </ 企业经理:姓名 >
None.gif             < 企业经理: 电话 >
None.gif               < 企业经理: 秘书电话 > (010)62345678 </ 企业经理:秘书电话 >
None.gif               < 企业经理: 手机 > 13601234567 </ 企业经理:手机 >
None.gif             </ 企业经理:电话 >
None.gif         </ 联系人:直接上司 >
None.gif     </ 联系人:联系人 >
None.gif     < 联系人: 联系人 >
None.gif         < 联系人: 姓名 > 李四 </ 联系人:姓名 >
None.gif         < 联系人:ID > 002 </ 联系人:ID >
None.gif         < 联系人: 公司 > B公司 </ 联系人:公司 >
None.gif         < 联系人:EMAIL > li@bbb.org </ 联系人:EMAIL >
None.gif         < 联系人: 电话 > (021)87654321 </ 联系人:电话 >
None.gif         < 联系人: 地址 >
None.gif             < 联系人: 街道 > 南京路9876号 </ 联系人:街道 >
None.gif             < 联系人: 城市 > 上海市 </ 联系人:城市 >
None.gif             < 联系人: 省份 > 上海 </ 联系人:省份 >
None.gif         </ 联系人:地址 >
None.gif         < 联系人: 直接上司 > aa </ 联系人:直接上司 >
None.gif     </ 联系人:联系人 >
None.gif </ 联系人:联系人列表 >
None.gif

    client.xsd:

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

 

     manager.xsd:

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

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