在Java中使用DOM和XPath进行有效的XML处理

文档对象模型(Document Object Model,DOM)是公认的 W3C 标准,它被用于与平台及 语言无关的 XML 文档内容、结构和样式的动态访问和更新。它为表示文档定义了一套标准的 接口集,也为访问和操纵文档定义了一套标准的方法。DOM 得到广泛的支持和普及,并且它 以各种不同的语言实现,包括 Java、Perl、C、C++、VB、Tcl 和 Python。

正如我将在本文所演示的,当基于流的模型(例如 SAX)不能满足 XML 处理要求时,DOM 是一个极佳的选择。不幸的是,规范的几个方面,例如其语言无关性接口和“一切都是节点 (everything-is-a-node)”抽象概念的使用,使其难以使用且易于生成脆弱代码。这在最 近的几个大型 DOM 项目的研究中尤其明显,这些项目是由许多开发人员过去一年所创建的。 下面讨论了常见的问题及其补救措施。

文档对象模型

DOM 规范被设计成可与任何编程语言一起使用。因此,它尝试使用在所有语言中都可用的 一组通用的、核心的功能部件。DOM 规范同样尝试保持其接口定义方面的无关性。这就允许 Java 程序员在使用 Visual Basic 或 Perl 时应用他们的 DOM 知识,反之亦然。

该规范同样将文档的每个部分看成由类型和值组成的节点。这为处理文档的所有方面提供 了完美的概念性框架。例如,下面的 XML 片段

the Italicized portion.

就是通过以下的 DOM 结构表示的:

图 1:XML 文档的 DOM 表示

树的每个 Document、Element、Text 和 Attr 部分都是 DOM Node 。

完美的抽象确实付出了代价。考虑 XML 片段: Value 。您或许会认为文本的值可以通过 普通的 Java String 对象来表示,并且通过简单的 getValue 调用可访问。实际上,文本被 当成 tagname 节点下的一个或多个子 Node 。因此,为了获取文本值,您需要遍历 tagname 的子节点,将每个值整理成一个字符串。这样做有充分的理由: tagname 可能包含其它嵌入 的 XML 元素,在这种情况下获取其文本值没有多大意义。然而,在现实世界中,我们看到由 于缺乏便利的函数导致频繁的编码错误占了 80% 的情况,这样做的确有意义。

设计问题

DOM 语言无关性的缺点是通常在每个编程语言中使用的一整套工作方法和模式不能被使用 。例如,不能使用熟悉的 Java new 构造创建新的 Element ,开发者必须使用工厂构造器方 法。 Node 的集合被表示成 NodeList ,而不是通常的 List 或 Iterator 对象。这些微小 的不便意味着不同寻常的编码实践和增多的代码行,并且它们迫使程序员学习 DOM 的行事方 法而不是用直觉的方法。

DOM 使用“一切都是节点”的抽象。这就意味着几乎 XML 文档的每个部分,例如: Document、Element 和 Attr ,全都继承( extend ) Node 接口。这不仅是概念上完美, 而且还允许每个 DOM 的不同实现通过标准接口使其自身的类可见,并且没有通过中间包装类 所导致的性能损失。

由于存在的节点类型数量及其访问方法缺乏一致性,“一切都是节点”的抽象丧失了一些 意义。例如, insertData 方法被用来设置 CharacterData 节点的值,而通过使用 setValue 方法来设置 Attr (属性)节点的值。由于对于不同的节点存在不同的接口,模型 的一致性和完美性降低了,而学习曲线增加了。

时间: 2024-11-05 16:30:27

在Java中使用DOM和XPath进行有效的XML处理的相关文章

在java中使用dom解析xml的示例分析_java

dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之听起来怪吓人的,不过使用它来读取点小东西相对Sax而言还是挺方便的 至于它的增删操作等,我是不打算写了,在我看教程的时候我就差点被那代码给丑到吐了 也正因为如此,才有后来那些jdom和dom4j等工具的存在-- 不多说,直接上代码 Dom解析示例 复制代码 代码如下: import java.io.File; import javax.xml.parsers.Document

java中使用dom解析xml文件的实现代码

 代码如下 复制代码 import java.io.File;   import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;   import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import o

java中如何将数据保存为txt、xml文件并上传到oracle数据库中 非常感谢!

问题描述 我想写一段代码,将一堆数据保存为一般文件,纪录式文件,xml文件,然后上传到oracle数据库中,因为之前没有到过类似的开发,所以无从开始,跪求帮忙了 解决方案 解决方案二:也许你可以baidu.google下,应该能找到很多例子,祝你好运!java读写xml文件如下:解决方案三:就是最基本的IO文件操作和JDBC操作.记得Oracle上用CLOB字段类型来保存大文本.解决方案四:引用2楼magong的回复: 就是最基本的IO文件操作和JDBC操作.记得Oracle上用CLOB字段类型

Java中关于XML的API惊鸿一瞥

xml 简单介绍一下Java关于xml的API,这样大家看到了缩写就知道是干什么的了.水平有限,多多包涵. 1.JAXP(Java API for XML Parsing) 2.JAXB(Java API for XML Binding) 3.JAXM(Java API for XML Messaging) 4.JAX-RPC(Java API for XML-RPC) 1.JAXP定义了在Java中使用DOM, SAX, XSLT的通用的接口.这样在你的程序中你只要使用这些通用的接口,当你需要

Java中关于XML的API_JSP编程

简单介绍一下Java关于xml的API,这样大家看到了缩写就知道是干什么的了.水平有限,多多包涵. 1.JAXP(Java API for XML Parsing) 2.JAXB(Java API for XML Binding) 3.JAXM(Java API for XML Messaging) 4.JAX-RPC(Java API for XML-RPC) 1.JAXP定义了在Java中使用DOM, SAX, XSLT的通用的接口.这样在你的程序中你只要使用这些通用的接口,当你需要改变具体

在JAVA中使用文档对象模型DOM经验小结

dom|对象 文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性.DOM标准是标准的.它很强壮且完整,并且有许多实现.这是许多大型安装的决定因素--特别是对产品应用程序,以避免在API发生改变时进行大量的改写. 以上是我在选择处理XML数据时之所以没有选择JDOM或者dom4j等其它面向对象的标准的原因,不过也由于DOM从一开始就是一种与语言无关的模型,而且它更趋向用于像C或Perl这类语言,没有利用Java的面向对象的性能,所以在使用的过程中也遇

研究 Java 中 XML 文档模型的特性和性能

xml|性能 Java 中的 XML: 文档模型,第一部分:性能 研究 Java 中 XML 文档模型的特性和性能 文档选项 将此页作为电子邮件发送 最新推荐 Java 应用开发源动力 - 下载免费软件,快速启动开发 级别: 初级 Dennis M. Sosnoski, 总裁, Sosnoski Software Solutions, Inc. 2001 年 9 月 01 日 在本文中,Java 顾问 Dennis Sosnoski 比较几个 Java 文档模型的性能和功能.当选择模型时,无法做

Java中四种XML解析技术之不完全测试

xml 在平时工作中,难免会遇到把XML作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历XML这块来测试,因为遍历XML是工作中使用最多的(至少我认为). 预备 测试环境: AMD毒龙1.4G OC 1.5G.256M DDR333.Windows2000 Server SP4.Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在Debug模式下测试. XML文件格式如下: <?xml ver

java中四种操作xml方式的比较

xml|比较   1. 介绍 1)DOM(JAXP Crimson解析器)         DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还