科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE6新特性: XML API 与Web服务2

Java SE6新特性: XML API 与Web服务2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。

作者:沈羽 来源:IT专家网 2008年5月9日

关键字: API XML Java SE 6 java

  • 评论
  • 分享微博
  • 分享邮件
 XML 框架介绍

  Java SE 6 平台提供的 XML 处理主要包括两个功能:XML 处理(JAXP,Java Architecture XML Processing)和 XML 绑定(JAXB,Java Architecture XML Binding)。JAXP 包括 SAX 框架 —— 遍历元素,做出处理;DOM 框架 —— 构造 XML 文件的树形表示;StAX 框架 —— 拖拽方式的解析;XSLT 框架 —— 将 XML 数据转换成其他格式。JAXB 则是负责将 XML 文件和 Java 对象绑定,在新版 JDK 中,被大量的使用在 Web 服务技术中。

  SAX 框架(Simple API for XML)

  SAX 全称 Simple API for XML,该框架使用了事件处理机制来处理 XML 文件,图 3 展示了这个过程。

  图 3. SAX 框架处理 XML 文件的流程

  图 3. SAX 框架处理 XML 文件的流程

  SAXParser 将 XML 文件当作流读入。当 parser 遇到 Element_A,就会产生一个事件,然后将该事件发送给处理类。SAX 框架的一大特点是对于节点的处理是上下文无关的。比如 图 3 中 SAXParser,允许注册一个处理类,这个处理类对于所有节点并不加以区分,对他们的处理过程都是一致的。一般包括 startElement 和 endElement 等动作。清单 2 给出了处理类的 startElement 动作的伪代码。

  清单 2. 处理类的 startElement 动作的伪代码

1    CLASS Listener < DefaultListener
2        PROCEDURE StartElement(…)
3            IF ( node->Obj.name == ‘Node’ )
4                // Do some calculation
5            FI
6        END
7    END
8 SAXParser->SetListener(new Listener)

  使用 SAX 框架,对于 Node 节点的处理并不会根据其前驱或者后缀节点的不同而有所区别。伪代码 3-5 行说明了这一点。一旦发现节点名称是 Node,则进行预定的处理。这个框架本身并不支持对节点进行上下文相关的处理,除非开发者另外维护一些数据结构来记录上下文状态。正是由于 SAX 框架不需要记录的状态信息,所以运行时,SAX 框架占用的内存(footprint)比较小,解析的速度也比较快。

DOM 框架(Document Object Model)

  DOM 框架的全称是 Document Object Model。顾名思义,这个框架会建立一个对象模型。针对每个节点,以及节点之间的关系在内存中生成一个树形结构。这个特点与 SAX 框架截然相反。需要注意的是,DOM 框架提供的对象树模型与我们通常理解的 XML 文件结构树模型是有一定的区别的。图 4 给出了一个 XML 文件的结构。

  图 4. DOM 框架的对象模型

  图 4. DOM 框架的对象模型

  图 4 中的 Element_B 具有 清单 3 这样的结构:

  清单 3. Element_B 的 XML 结构

  

<Element_B>This is start of Element_B
    <Node>…</Node>
    This is end of Element_B
</Element_B>
  

  按照 图 4 和 清单 3 给出的结构,一般的对象的观点理解,Element_B 包含子元素 Node,而两句话”This is start of Element_B”与”This is end of Element_B”是 Element_B 节点的内容。而实际上,当针对 Element_B 调用 Element.getContent,得到的是 Element_B 这个名字本身,两句文本同 Node 一样,也是作为子节点的。可以这样认为,DOM 的对象模型,在内存中模拟的是 XML 文件的物理存储结构,而不是节点间的逻辑关系。DOM 中结点的类型也是通过 getContent 返回的节点名字符串区别的。当客户端识别节点类型时,通常会形成以下的代码片断:

  清单 4. 使用 DOM 框架的客户端代码

  

name = Element.getContent
SWITCH name
CASE Element_A:
// Do something
BREAK
CASE Element_B:
// Do something
BREAK
DEFAULT:
END

  这种方式是很明显的早绑定 —— 编码时 / 编译时绑定,而不是面向对象语言中使用的运行时绑定技术 —— 继承带来的虚拟函数特性。这个问题的产生和 DOM 框架的设计目标有关。DOM 的目标是一个编程语言无关的,用来处理大段复杂 XML 文件的框架(参见 参考资源),比如书籍和文章。DOM 框架一个显著的特征是善于处理节点与文本混合的 XML 文件(Mixed-Content Model)。这种设计使得 XML 形成树的过程是一个直接映射,不需要进行概念上的转换,也就节省掉很多的处理细节,一定程度上提高了效率。这一点在处理大文件时比较明显,兼顾了效率和上下文状态问题。另一方面,由于编程语言无关的设计目标,也决定了放弃虚函数机制是必要的。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章