《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.5 使用命名空间

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第3章 ,第3.5节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.5 使用命名空间

Java语言使用包来避免名字冲突。程序员可以为不同的类使用相同的名字,只要它们不在同一个包中即可。XML也有类似的命名空间(namespace)机制,可以用于元素名和属性名。
名字空间是由统一资源标识符(Uniform Resource Identif?ier, URI)来标识的,比如:
image

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

表示了不同的命名空间,尽管Web服务器将为这两个URL提供同一个文档。
在命名空间的URL所表示的位置上不需要有任何文档,XML解析器不会尝试去该处查找任何东西。然而,为了给可能会遇到不熟悉的命名空间的程序员提供一些帮助,人们习惯于将解释该命名空间的文档放在URL位置上。例如,如果你把浏览器指向XML Schema的命名空间URL(http://www.w3.org /2001/XMLSchema),就会发现一个描述XML Schema标准的文档。
为什么要用HTTP URL作为命名空间的标识符?这是因为这样容易确保它们是独一无二的。如果使用实际的URL,那么主机部分的唯一性就将由域名系统来保证。然后,你的组织可以安排URL余下部分的唯一性,这和Java包名中的反向域名是一个原理。
尽管长名字空间的唯一性很好,但是你肯定不想处理超出必需范围的长标识符。在Java编程语言中,可以用import机制来指定很长的包名,然后就可以只使用较短的类名了。在XML中有类似的机制,比如:
image

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

这时,第一个子元素和孙元素都是第二个命名空间的一部分。
无论是只需要一个命名空间,还是命名空间本质上是嵌套的,这个简单机制都工作得很好。如若不然,就需要使用第二种机制,而Java中并没有类似的机制。你可以用一个前缀来表示命名空间,即为特定文档选取的一个短的标识符。下面是一个典型的例子:
image

用于定义命名空间和前缀。在我们的例子中,前缀是字符串xsd。这样,xsd:schema实际上指的是命名空间http://www.w3.org/2001/XMLSchema中的schema。

注意:只有子元素继承了它们父元素的命名空间,而不带显式前缀的属性并不是命名空间的一部分。请看下面这个特意构造出来的例子:

image
image

  

  在这个示例中,元素conf?iguration和size是URI为http://www.horstmann.com/ corejava的命名空间的一部分。属性si:unit是URI为http://www.bipm.fr/enus/3_SI/si.html的命名空间的一部分。然而,属性value不是任何命名空间的一部分。

你可以控制解析器对命名空间的处理。默认情况下,Java XML库的DOM解析器并非“命名空间感知的”。
要打开命名空间处理特性,请调用DocumentBuilderFactory类的setNamespace Aware方法:
image

这样,该工厂产生的所有生成器便都支持命名空间了。每个节点有三个属性:

  • 带有前缀的限定名(qualif?ied),由getNodeName和getTagName等方法返回。
  • 命名空间URI,由getNamespaceURI方法返回。
  • 不带前缀和命名空间的本地名(local name),由getLocalName方法返回。

下面是一个例子。假设解析器看到了以下元素:
image

它会报告如下信息:

  • 限定名 = xsd:schema
  • 命名空间 URI = http://www.w3.org/2001/XMLSchema
  • 本地名 = schema

    注意:如果对命名空间的感知特性被关闭,getLocalName和getNamespaceURI方法将返回null。

image

相关文章
|
1月前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
2月前
|
XML Java API
你必须掌握的 21 个 Java 核心技术!,千峰Java
你必须掌握的 21 个 Java 核心技术!,千峰Java
|
2月前
|
安全 Java API
java的高级特性
Java的关键特性包括:跨平台能力,依赖JVM实现“一次编写,到处运行”;面向对象编程,通过类和对象抽象提高代码复用和维护性;内置安全机制如内存管理和异常处理;丰富的标准类库提供各种API;以及支持多线程,充分利用CPU资源。学习路线上,从基础的面向对象和类库使用开始,逐渐深入到多线程和高级特性。
24 1
|
1月前
|
存储 Java 编译器
Java核心技术第八章-泛型
Java核心技术第八章-泛型
|
1月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【6月更文挑战第18天】在Java中,Map的两大代表HashMap和TreeMap提供高效键值对操作。HashMap允许设定初始容量和加载因子以优化性能,非线程安全,可借助synchronized或ConcurrentHashMap处理多线程。遍历可通过entrySet()、keySet()和values()。而TreeMap依据键进行排序,支持自然排序和自定义Comparator,提供范围查询、获取首尾键的功能,适用于需有序遍历的场景。理解和利用这些特性能增强代码功能和效率。
|
2月前
|
Java API
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
|
2月前
|
Java API
Java从入门到精通:2.1.4深入学习Java核心技术——Java的输入输出流
Java从入门到精通:2.1.4深入学习Java核心技术——Java的输入输出流
|
2月前
|
IDE Java 程序员
Java程序员必备的21个核心技术,你都掌握了哪些?,深入浅出Java开发
Java程序员必备的21个核心技术,你都掌握了哪些?,深入浅出Java开发
|
2月前
|
消息中间件 存储 Java
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
|
XML JSON 网络协议
你必须掌握的 21 个 Java 核心技术!
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java。 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的、和Java中各个框架相关的内容。 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。
你必须掌握的 21 个 Java 核心技术!