关于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来做个测试。
初学进阶里面说命名空间是用于在一个XML里面引入多个DTD的,的确,概念上是这样子的,不过网上的资料显示XML的命名空间并不支持DTD格式的格式定义,也就是说,想实现一个XML当中有多个文档格式的话,就必须要使用Schema。
先了解一下我们要实现的例子:

< 联系人列表 >




















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









看以上的两个文档,实际上就是我们想表达的数据,两个抽象的实体“联系人”和“企业经理”之间存在着一对一的关系。
但是我们现在有个麻烦,在联系人列表这个XML当中,有两个“姓名”元素和两个“电话”元素,他们表达的是不同的意思,其文档格式定义也不同。他们分别对应着不同的DTD或者是Schema。
为了解决这一问题,就有了命名空间的概念,首先,对于我们要最终作用于其上的client.xml,他必须首先区别联系人和企业经理,做法就是在前面加前缀,比如联系人的名字改为“联系人:名字”而企业经理的名字则改为“企业经理:名字”
其次,两个不同的文档定义文件必须首先定义好命名空间,在作用于XML文件的时候, 使命名空间和XML声明中的命名空间一致。
下面分别给出例子代码:
client.xml:








































client.xsd:










































manager.xsd:
























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