XML 对象模型

处理 XML 的 API
基于 XML 的应用程序从逻辑上分成 3 个层次,下面是 XML 文档或数据,中间是 XML 解析器,上面是 XML 应用程序。XML 解析器的作用是读入 XML 文档或数据,将 XML 建造(build)为内存中的数据结构,便于应用程序处理,或者根据 XML 中包含的信息,调用应用程序提供的回调方法。由于 XML 是基于文本的,具有平台中立性,各种语言都有相应的 XML 解析器。

处理 XML 的 API 有这几种:DOM、SAX、STAX、JAXP、JDOM 和 DOM4J,这几种是最常用的,还有其它的一些不常用的 API。其中 DOM 可以用于多种语言,SAX 可以用于 Java 与 C++,JAXP、JDOM 和 DOM4J 只能用于 Java。一个 XML 解析器至少需要实现 DOM 或 SAX 两种 API 中的一种,不过现在常用的 Java XML 解析器都同时实现了 DOM、SAX 和 JAXP 3 种 API。JDOM 和 DOM4J 是由单独的包(jar)来实现的,使用 JDOM 和 DOM4J 需要得到标准的 XML 解析器的支持。目前在众多的 Java XML 解析器中使用最广的是 Xerces 和 Crimson,它们都是开源软件组织 Apache 软件基金会资助的开源软件。其中 Xerces 最初的代码来自 IBM 的贡献,Crimson 最初的代码来自 Sun 的贡献。JDK 1.4 以后的版本中已经包括有 XML 解析器,因此不再需要另外的 XML 解析器。IBM JDK 1.4 本带的 XML 解析器是 Xerces 的早期版本,Sun JDK 1.4 本身带的 XML 解析器是 Crimson 的早期版本(孩子总是自家的亲)。不过即使使用 JDK 1.4,你仍然可以使用其它的 XML 解析器。在我们的开发中全部使用 Xerces,主要是因为 Xerces 在所有 Java XML 解析器中功能是最丰富的,根据性能测试 Xerces 的性能要比 Crimson 好的多,而且我们在 Linux 上出于性能的考虑全部使用 IBM 的 JRE/JDK。

DOM 简介:
DOM 对于 XML 的处理方式就是把整个 XML 读到内存中形成一棵树状结构,然后用各种方法对这棵数进行遍历、插入、删除、修剪等操作。因为 DOM 是 W3C 的正式标准,所有的语言都有支持 DOM 的解析器,包括 Java、C/C++、Perl、JavaScript 等等。DOM 的优点是信息量丰富(全部都在内存中),而且可以随机访问,尤其是在处理前后相互关联的元素时非常方便。DOM 的缺点是 XML 应用程序在处理 XML 之前必须先由 XML 解析器把整个 XML 读进内存并生成树状结构,如果 XML 非常大,例如 10M,解析的过程是非常慢的。如果再加上 XSLT 转换(这是一种必须要使用 DOM 的操作)这类同样耗费资源的操作,可能会耗尽系统的内存资源。所以标准 DOM 只适合于中小型 XML 的处理。

SAX 简介:
为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX。SAX 采用事件驱动的方式来处理 XML,它的处理方式是:为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供。解析器以数据流的方式读入 XML,当遇到某个元素、属性、内容时就调用相应的回调方法。SAX 的优点是处理效率高,适合处理大型 XML。缺点是 SAX 对 XML 是只读的,不能够对 XML 进行写操作,而且 SAX 处理 XML 中前后相互关联的元素时也没有 DOM 方便,因为应用程序必须自己保留以前事件的状态信息。但是 SAX 还是取得了巨大的成功,后来 SAX 还被移植到了 C++ 等语言中。SAX 更详细的优缺点可以查看《XML 高级编程》第 6 章的内容,我们这里有这本书的电子版。


STAX
StAX实际上是定义了一个拉式(pull)的xml解析器。 一般的解析xml是通过DOM或SAX形式。
DOM的问题是需要一次性读入整个XML,对于大型的xml效率低。SAX是基于事件,
当读取到文档的某个位置会触发到某个事件。而这个读取过程是不受控的,
就是必须一次读完(对这个不熟悉)。这就是所谓推(push)式的。即把整个文件推给client。
StAX也是类似于SAX的事件,但是是由client的next()来控制指针的前进,
是把文件的内容pull出来的。这大大增强了客户端的控制能力,例如写入和修改节点。

StAX适合于对已知结构(Schema,DTD)的XML文件进行读写操作。
现在JSR173的RI是由BEA实现的,好像还没有code放出来,没找到。
BEA的另一个捐献给Apache的OSS,XmlBeans,也是用到了JSR173的一些包,还没仔细看
DOM4J最近出了1.5RC1,也部分支持了StAX。


JAXP 简介:
你们对 XML 熟悉了以后可能会经常听到 JAXP 这个词。JAXP 其实不是一个独立的 XML API,它的作用是为了解决不同的 XML 解析器之间的兼容性问题的。在 Sun 推出 JAXP 之前,商业公司(IBM、Oracle、Sun,etc.)、XML 专业研究者以及开源软件爱好者开发出来多种多样的 XML 解析器。这些解析器有的仅仅实现了 DOM API,有的同时实现了DOM 和 SAX。在我学习 XML 的过程中,我所知道的 Java XML 解析器就有 7、8 种。这些不同的 XML 解析器各有各的特长,它们虽然都遵从 W3C DOM 或 SAX 的规范,但是或多或少存在着一些差别,这使得为一种解析器编写的应用程序移植到另一种解析器变得有些困难(也不是非常困难,只是不太方便)。为了解决这个 问题,Sun 在 DOM、SAX 的 API 之上加了一个抽象层(基本上就是加了一个抽象工厂的设计模式,如果你们对设计模式有所了解的话),这就是 JAXP。JAXP 主要采用反射的方式来工作,可以动态加载所使用的 XML 解析器。使用 JAXP 来做 XML 开发,可以完全忽略不同的 XML 解析器之间的差别,不需要修改代码就可以更换成另外的 XML 解析器。JAXP 目前已经得到大多数 Java XML 解析器的支持。除了封装 DOM、SAX 的那些工厂类外,JAXP 还包含用于 XSLT 转换的 API(也是一些工厂类),这些功能在 javax.xml.transform 这个包里。

JDOM 简介:
除了 SAX,Java 开发人员还发明了 JDOM。虽然名字里有 DOM,JDOM 其实与 DOM 毫无关系。JDOM 严格说来其实是一种对象模型,除了处理 XML,还可以用于很多其它用途。JDOM 的输入可以有多种格式,输出也可以有多种格式。这些格式包括 XML 文件或数据流、Java 属性文件、标准 DOM 树等等。JDOM 利用 SAX 或 DOM(一般是用 SAX,极少用 DOM)读入 XML 中的信息后在内存中生成自己的数据结构,就是通过组合(composition)关系嵌套在一起的一系列对象,然后用 Java 程序员最习惯的面向对象的方式来处理这些数据,处理结束后可以非常方便地输出成各种格式。和 DOM、SAX 相比,用 JDOM 来做 XML 开发更加容易(代码量更少)。JDOM 的主要的缺点是最初的设计未考虑性能问题,因此性能很差,而且全部使用具体类来实现导致了灵活性较差,但是考虑到易用性和开发效率,JDOM 仍然得到了广泛的使用。

DOM4J 简介:
由于 JDOM 本身存在着一些设计缺陷,开发到一半,JDOM 的一些开发人员分了出来重新启动了一个开源项目 DOM4J。DOM4J 与 JDOM 所要达到的目标是一样的,即提供一套比 DOM、SAX 使用更加方便的处理 XML 的 API,同时避免 DOM、SAX 的主要缺点。DOM4J 重新做了设计,完全基于接口和多态,因此提高了灵活性。DOM4J 在概念上对 XML 的理解与 DOM 非常相似,只要你理解了 DOM,你就可以轻而易举地理解 DOM4J,实际上 DOM4J 可以看做是一个更好的 DOM 实现。而且 DOM4J 保持了 JDOM 的易用性,性能上也比 JDOM 有了非常大的提高。最值得一提的是 DOM4J 完全支持 XPath,看看 DOM4J 的这段代码:

代码:
List list = document.selectNodes( //foo/bar );
Node node = document.selectSingleNode(//foo/bar/author);

这与我们前台写的 JavaScript 是非常相似的,我们学会 DOM4J 是几乎不需要花什么时间。
DOM4J 与 JDOM 一样,通过 SAX 或 DOM(一般用 SAX)读入 XML 中的信息在内存中生成自己的数据结构,因此 DOM4J 至少需要一个实现了 SAX 的 XML 解析器,我们可以直接使用 Xerces。
由于 DOM4J 具有易用性、性能、灵活性、功能强大等多方面的优势,今后我们如果需要在服务器端做 XML 开发,DOM4J 将是我们主要采用的工具。

<sentence>

   The &projectName; <![CDATA[<i>project</i>]]> is

   <?editor: red><bold>important</bold><?editor: normal>.

</sentence>

 

在DOM中表示成的对象模型如下:

+ ELEMENT: sentence

   + TEXT: The

   + ENTITY REF: projectName

     + COMMENT: The latest name we're using

     + TEXT: Eagle

   + CDATA: <i>project</i>

   + TEXT: is

   + PI: editor: red

   + ELEMENT: bold

     + TEXT: important

   + PI: editor: normal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值