读书人

(5) 使用命名空间

发布时间: 2012-10-06 17:34:01 作者: rapoo

(五) 使用命名空间

Java语言使用包来避免名字冲突。程序员可以在不同的类中使用相同的名字,只要它们不在同一个包中即可。XML也有类似的命名空间(namespace)机制,可以用于元素名和属性名。

1.命名空间是由统一资源标识符(Uniform Resource Identifier, URI) 来标识的
例:

    http://www.w3.org/2001/XMLSchema    uuid:1c759aed-b748-475c-ab68-10679700c4f2    urn:com:books-r-us

?
2.HTTP的URL格式是最常用的。注意,URL只能作标识符字符串,而不是一个文件的定位器。
例如:命名空间标识符

    http://www.w3.org/    http://www.w3.org/index.html
?


表示了不同的命名空间,尽管Web服务器将为这两个URL提供相同的文档。

3.在命名空间的URI不需要有任何文档,XML解析器不会尝试去该处找到任何东西。但,人们习惯于将解释该命名空间的文档放在URL位置上。
例如,XML Schema的命名空间URL(http://www.w3.org/2001/XMLSchema),为一个描述XML Schema标准的文档。

4.使用HTTP URL作为命名空间标识符的原因,是因为这样容易确保它们是独一无二的。如果使用一个实际的URL,那么主机部分的唯一性就将由域名系统来保证。这个Java包名中的反向域名是一个原理。
为了唯一性,通常需要用长命名空间标识符,并可以通过类似Java中import机制来设定很长的包名一样,来处理长标识符。
例:

    <element xmlns="namespaceURI">        children    </element>

?

现在,元素和它的子元素都是给定命名空间的一部分。
子元素可以提供自己的命名空间,例:

?

    <element xmlns="namespaceURI1">        <child xmlns="namespaceURI2">            grandchildren        <child>        more children    </element>

?

这时,第一个子元素和孙元素都是第二个命名空间的一部分。

5.无论是只需要一个命名空间,还是命名空间本质上是嵌套,这个简单机制都工作的很好。否则,就需要使用第二种机制,Java中没有类似的机制。可以拥有命名空间的别名,即为特定文档选取的一个短的标识符。
例:

?

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">        <xsd:element name="gridbag" type="GridBagType"/>        ...    </xsd:schema>
?

下面的属性:xmlns:alias="namespaceURI"
用于定义命名空间和别名。在上述例子中,别名是xsd。xsd:schema实际上是指“命名空间http://www.w3.org/2001/XMLSchema中的schema”

6.注意:只有子元素继承了它们父元素的命名空间,而不带显示别名前缀的属性不是命名空间的一部分。
例:

    <configuration xmlns="http://namespaceURI1"        xmlns:si="http//namespaceURI2">        <size value="210" si:unit="mm"/>        ...    </configuration>

?

在这个示例中,元素configuration和size是 http://namespaceURI1 的命名空间的一部分,属性 si:unit 是 http://namespaceURI2 的一部分。然而属性值不是任何命名空间的一部分。

7.可以控制解析器对命名空间的处理,默认的,Java的DOM解析器默认不支持“命名空间”。
要打开命名空间处理特性,调用DocumentBuilderFactory类的setNamespaceAware方法 : factory.setNamespaceAware(true)
这样工厂生产的所有生成器便都支持命名空间,每个节点有三个属性:
(1)带有别名前缀的限定名(qualifield),由getNodeName和getTagName方法返回。
(2)命名空间URI,由getNamespaceURI方法来返回。
(3)不带别名前缀和命名空间的本地名(local name),由getLocalName方法返回。
例:
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema">
限定名 = xsd:schema
命名空间URI = http://www.w3.org/2001/XMLSchema
本地名 = schema
注意:如果命名空间特性被关闭,getLocalName和getNamespaceURI方法将返回null。

读书人网 >编程

热点推荐