`

xml命名空间

    博客分类:
  • xml
 
阅读更多
1. 什么是defaultNamespace?
就是xmlns属性的值。defaultNamespace的作用就是它下面的没有prefix的element的Namespace就是defaultNamespace. 示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--defaultNamespace为http://schema,    a的namespace为http://schema1 -->
<a xmlns="http://schema1" xmlns:edi="http://ccc.cc">
<!--b由于没有前缀,所以会自动采用defaultNamespace, 即http://schema1-->
 <b edi:attr1="123" attr2="1.112">qwe</b>
 <edi:a xmlns=http://xxx.xxx>
  <!--d的namespace不再是http://schema1, 而是http://xxx.xxx, 因为d的父节点也定义了一个defaultNamespace: http://xxx.xxx-->
  <d>false</d>
 </edi:a>
 <edi:a>
<!--注意,虽然e的父节点Namespace为http://ccc.ccc, 但是e的namespace并不是http://ccc.cc, 而是http://schema1-->
    <e>false</e>
 </edi:a>
</a>


2.如果一个element定义了xmlns="xxx"属性, 那么直接具有xxx的Namespace, 除非这个element自己包含一个前缀。
...
<!-- a 具有xxx 命名空间 -->
<!-- 属性d不具有xxx命名空间 -->
<a xmlns="xxx" d="ddd">
  <!--b也具有xxx命名空间 -->
  <b>
  ...
  </b>
  <!--c不具有xxx的命名空间-->
  <edi:c>
  ... 
  <edi:c>
</a>
... 

<!--a不具有xxx命名空间, 因为它使用着edi的命名空间-->
...
<edi:a xmlns="xxx">
   <b>
   ...
   </b>
</edi:a>
...

5.3 Uniqueness of Attributes
In XML documents conforming to this specification, no tag may contain two attributes which: 

have identical names, or 
have qualified names with the same local part and with prefixes which have been bound to namespace names that are identical. 
For example, each of the bad start-tags is illegal in the following: 

<!-- http://www.w3.org is bound to n1 and n2 -->
<!--没有prefix的attribute不具有任何命名空间-->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <!--n1:a和n2:a的命名空间和属性名均相同,不允许出现在同一个element中-->
  <bad n1:a="1"  n2:a="2" />
</x> 

However, each of the following is legal, the second because the default namespace does not apply to attribute names: 

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <!--属性a的命名空间为空,而n1:a的命名空间为http://www.w3.org-->
  <good a="1"     n1:a="2" />
</x> 



targetNamespace

在Schema中targetNamespace定义了Schema定义出的新元素与属性的名称空间。也就是它是对所定义的XML模型进行限制:限制定义出的元素,或者属性的名称空间。与targetNamespace相关的还有两个属性:elementFormDefault ,attributeFormDefault,这两个属性的缺省值都是unqualified。 如果定义为unqualified表示定义的元素的名称空间可以缺省,此时直接引用父元素的名称空间。如果是qualified则表示,必需要指明名称空间,不能直接引用其父元素的,要指明。(如果Schema限定的文档,刚好定义了”空的名称空间“并且刚好与targetNamespace一至,可以缺省)。


    在WSDL中也有一个targetNamespace,但是没有Schema中的两个属性。但其它这两个属性在WSDL中其实并不需要,不管这两个属性取值,对文档其实没有什么影响,所以也就不用定义这两个属性。

    不失一般性,下面我假定WSDL与SOAP绑定。WSDL是用来定义的是服务的一些属性,targetNamespace定义的服务“收到的请求”与“发出响应”的一些属性(也许有其它的,但我没发现,如果有知道的,请指教),定义了请求与响应对应的XML元素应该使用的名称空间。从SOAP协议中,我们可以看到,响应与请求元素的父元素是<env:Body>,它的名称空间是SOAP标准指定了的,根据不同的SOPA协议版本不同,比如Soap1.1为http://schemas.xmlsoap.org/soap/envelope/  ,而Soap1.2为http://www.w3.org/2001/06/soap-envelope。

   这样导致了响应与请求元素也就无法使用其父元素的名称空间,要使响应与请求的名称空间与targetNamespace一至,元素也就不能使用缺省的父元素的名称空间,必需显示的使用完整的名称空间。这样在Schema中出现的elementFormDefault ,attributeFormDefault两个属性,也就在WSDL中没有存在的必要了。


也就是WSDL与Schema中的targetNamespace基本上是一至,你完全可以相互参考起来理解。


参考文献:
http://xml.org.cn/dispbbs.asp?BoardID=23&id=25672&replyID=17053&star=1&skin=0

http://www.w3.org/TR/xmlschema-0/#UnqualLocals   (Schema的官方文档)

http://www.w3.org/TR/wsdl#_Toc492291093     (WSDL的官方文档)



schemaLocation是用来指定XML Schema文档路径的

新的 XML Schema 系统即将成为 W3C 推荐标准,目的是为了克服 DTD 的局限性(请参阅侧栏, DTD 的局限性 ),为 XML 文档提供丰富的语法结构。本文展示了模式的灵活性,说明如何使用 XML Schema 系统来定义最基本的 XML 文档构造块——元素。
XML Schema 比 DTD 更强大。为了说明 XML Schema 机制的强大功能,下面三个程序清单简要比较了表示元素的不同方式。 清单 1给出了一个 XML 文档片段, 清单 2用 DTD 语法声明了这两个元素, 清单 3则是相应的 XML Schema 语法形式。要注意, 清单 3中所用的是相同的 XML 语法。通过模式,验证解析器可以检查元素 InvoiceNo 是否是正整数,元素 ProductID 的首字符是否为 A 到 Z 之间的字母,后面为六个阿拉伯数字。相反,引用 DTD 的验证解析器只能检查这些元素是否用字符串表示。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics