关于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来做个测试。