在文章 XML命名空间深度解析 —— 命名空间简介 中对XML命名空间进行了简单介绍,本文将会对命名空间在XML1.0 和 XML1.1中的区别进行介绍。让我们从一个小的例子开始命名空间之旅。
例1: XML1.0中命名空间定义为空
<XML version="1.0">
<root xmlns:pre="">
</root>
在该例中,在通过xmlns绑定命名空间的时候,命名空间的url为空,即"",如果试图去解析该文件,将会报出一个错误:
The value of the attribute "prefix="xmlns",localpart="pre",rawname="xmlns:pre"" is invalid. Prefixed namespace
bindings may not be empty.
报错的原因是在XML1.0规范明确规定不允许把prefix绑定到空的URL上,所以报错。那在XML1.1中会怎样呢?
例2: XML1.1中命名空间定义为空
<XML version="1.1">
<root xmlns:pre="">
</root>
解析可以发现,没有报错,因为在XML1.1中是允许通过把URL设置成空来解除命名空间和prefix的绑定。
例2: XML1.1中命名空间和prefix解除绑定
<XML version="1.1">
<pre:root xmlns:pre="url">
<ibm xmlns:pre=""/>
</pre:root>
在该例子中,root element里把命名空间rul和pre绑定,也就是在整个root范围内pre都是生效的,但到了root的子element ibm, 使用xmlns:pre=""解除了这种绑定,也就是在ibm这个element范围内,pre将不生效了。这也就是为什么例3中xml文件解析会失败的原因。
例3: XML1.1中命名空间和prefix解除绑定
<XML version="1.1">
<pre:root xmlns:pre="url">
<pre:ibm xmlns:pre=""/>
</pre:root>
对该xml文件的解析将会报出 pre is unbound.经过以上3个例子,相信大家都了解到了XML1.0和XML1.1中命名空间的区别,那么紧接着的问题就是如果是针对缺省命名空间呢?
例4: XML1.0中缺省命名空间定义为空
<XML version="1.0">
<root xmlns="">
</root>
对该xml文件的解析将会成功,针对缺省命名空间,XML1.0和XML1.1都支持通过空url解除绑定。
例5: XML1.0中解除缺省命名空间绑定
<XML version="1.0">
<root xmlns="url">
<ibm xmlns=""/>
</root>
对该xml文件的解析将会成功,ibm将不属于任何命名空间。