没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
XML From IBM Developer works
简介:该文简要描述了 DOM 的概念和内部逻辑结构,给出了 DOM 文档操作和 XML 文件互相转换的 java 实
现过程。郭洪锋:主要从事 UNIX 系统下分布式应用的开发和研究。您可以通过电子邮件 ghf_email@sohu.com
和他联系
简介
目前, 已于 年 月 日推出了规范 。文档对象模型()是 和 文档的编程接口规
范,它与平台和语言是无关的,因而可以用各种语言在各种平台上实现。该模型定义了 和 文件在内存中的逻辑结构
(即为文档),提供了访问、存取 和 文件的方法。利用 规范,可以实现 文档和 之间的相互转换,
遍历、操作相应 文档的内容。可以说,要自由的操纵 文件,就要用到 规范。
内部逻辑结构
文档中的逻辑结构可以用节点树的形式进行表述。通过对 文件的解析处理, 文件中的元素便转化为 文档
中的节点对象。 的文档节点有 、、、 等等节点类型,其中每一个 文档必须有
一个 节点,并且为节点树的根节点。它可以有子节点,或者叶子节点如 节点、 节点等。任何的格
式良好的 文件中的每一个元素均有 文档中的一个节点类型与之对应。利用 接口将 文件转化成 文档
后,我们就可以自由的处理 文件了。
中的 接口
规范提供的 ! 的规范,目前 " 公司推出的 #$% 测试版中的 ! 遵循了 & 推荐接口的语义
说明,提供了相应的 语言的实现。
在 &'# 中,$#% 提供了 、、(#、(#)*、、 等接口,这些接口
均是访问 文档所必须的。我们可以利用这些接口创建、遍历、修改 文档。
在 &*&* 中,$#% 提供的 +)#& 和 +)#&,& 组合可以对 文件进行解析,
转换成 文档。
在 &*-&# 和 &*-&*& 中,#$% 提供了 "& 类和 "&"& 类,
可以用来将更新后的 文档写入生成的 文件中。
%例程
%将 文件转化成 文档
这个过程是获得一个 文件解析器,解析 文件转化成 文档的过程。
.#$% 中, 接口描述了对应于整个 文件的文档树,提供了对文档数据的访问,
是该步骤的目标。 接口可以从类 +)#& 中获取,该类包含了从
文档获得 文档实例的 !。 的解析器可以从类 +)#&,& 中获取。
在 #$% 中, 文件转化成 文档可以有如下代码实现:
//获得一个 文件的解析器
+)#&,&-&0+)#&,&1!*234
//解析 文件生成 文档的接口类,以便访问 。
+)#&5)#&0-&1+)#&234
#05)#&&*21,)2,)(334
%遍历 文档
获得接口类 # 实例后,可以对 的文档树进行访问。要遍历 文档,首先要
获得 6 元素。然后获得 6 元素的子节点列表。这里通过递归的方法实现遍历的目的。
//获得 6 元素
0#'234
//获得 6 元素的子节点列表
#)*0'7)#(#*234
//用递归方法实现 文档的遍历
82#)*34
其中 8 方法实现如下:
5))#82(#)*#)*39
(##4
)),4
"&)'*&4
)-2#)*''7230039
//该节点没有子节点
&&4
:
-&2)04)3
"*&)2;;<*&<;;<34
:
:
:
注意:上面的代码只是显示 Node 类型和 Text 类型的对象。它们的类型标识分别是 1 和 3。
%修改 文档
修改 文档的 ! 在 & 规范中做了说明,$#% 中的 &'# 中实现了这些 !。修改
文档操作主要集中在 、、(#、 等类中,这里给出的例子中是在解
析出的 文档中增加一系列对象,对应与在 文件中增加一条记录。
//获得 6 对象
&0#'234
//在 文档中增加一个 节点
5$0#&2; =";34
//将该节点转化成 & 对象的子节点
)#2#&34
//在 文档中增加一个 节点
5$)0#&2;);34
//将该节点转化成 5$ 对象的子节点
5$#7)#25$)34
//在 文档中增加一个 节点
5$0#&(#2;#&*#&5;34
//将该节点转化成 5$ 对象的子节点
5$)#7)#25$34
%%将 文档转化成 文件
//获得将 文档转化为 文件的转换器,在 #$% 中,有类 &*-&&,&
//来实现,类 &*-&& 实现转化 !。
&*-&&,&-&0&*-&&,&1!*234
&*-&&&*-&&0-&1&*-&&234
//将 对象转化为 "& 类对象,该对象表现为转化成别的表达形式的信息容器。
"&*&01"&2#34
//获得一个 "&6* 类对象,该对象是 文档转化成的其他形式的文档的容器,可以是 文件,文本文件, 文件。这里为一个
件。
"&6*&*01"&6*21,)2>?334
//调用 !,将 文档转化成 文件。
&*-&&&*-&2*&@&*34
这里提供了该例程的完整程序,该例程在 1)#1* 中 #$% 环境中运行通过。
以上给出了一个例子,读者可以从中了解到对 操作的思路。因为对 的操作均遵循了 规范,所以也适用于其它
语言对 的处理。
参考资料:
1. http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-2000-1113
这是篇细探 JAXP,Sun 的 Java API for XML 的文章,帮助解除了有关 JAXP 本质和服务目的的疑惑。本文
讲解了 JAXP 的基本概念,演示 XML 语法分析为什么需要 JAXP,并显示如何轻易更改 JAXP 使用的语法分
析器。本文还进一步讲述了 SAX 和 DOM 这两个流行的与 JAXP 相关的 Java 和 XML API。
Java 和 XML 在每一个技术领域都制造了新闻,并且对于软件开发人员来说,似乎是 1999 年和 2000 年最重要的发展。结果,
Java 和 XML API 的数量激增。其中两个最流行的 DOM 和 SAX 还引起极大兴趣,而 JDOM 和数据绑定 API 也接踵而来。只透
彻理解这些技术中的一个或两个就是一项艰巨任务,而正确使用所有这些技术就会使您成为专家。但在去年,另一个 API 给人
留下了深刻印象,它就是 Sun 的 Java API for XML,通常称为 JAXP。如果考虑到 Sun 在其平台上还没有任何特定于 XML 的
产品,那么这个进展就不足为奇。而令人惊奇的是人们对 JAXP 了解的缺乏。多数使用它的开发人员在他们所用的这个 API 的
概念理解上都有错误。
什么是 JAXP?
本文假设您有 SAX 和 DOM 的基本知识。这里实在没有足够篇幅来解释 SAX、DOM 和 JAXP。如果您是 XML 语法分析的新手,
那么可能要通过联机资源阅读 SAX 和 DOM,或者浏览我的书。(参考资源一节中有至 API 和我的书的链接。)获得基本知识
后再看本文会比较好。
API 还是抽象?
在讲解代码之前,介绍一些基本概念很重要。严格地说,JAXP 是 API,但是将其称为抽象层更准确。它不提供处理 XML 的新
方式,不补充 SAX 或 DOM,也不向 Java 和 XML 处理提供新功能。(如果在这点上理解有误,则本文正好适合您!)它只是
使通过 DOM 和 SAX 处理一些困难任务更容易。如果在使用 DOM 和 SAX API 时遇到特定于供应商的任务,它还使通过独立于
供应商的方式处理这些任务成为可能。
虽然要分别讲述所有这些特性,但是真正需要掌握的是:JAXP
不提供语法分析功能
!没有 SAX、DOM 或另一个 XML 语法分
析 API,就
无法分析
XML
语法
。有很多人曾让我将 DOM、SAX 或 JDOM 与 JAXP 进行对比。但进行这些对比是不可能的,因
为前三个 API 与 JAXP 的目的完全不同。SAX、DOM 和 JDOM 都分析 XML 语法。而 JAXP 却提供到达这些语法分析器和结果
的方式。它自身不提供分析文档语法的新方法。如果要正确使用 JAXP,则一定要弄清这点。这将使您比其它 XML 开发人员领
先一大截。
如果仍然怀疑(或认为我故弄玄虚),请从 Sun 的 Web 站点下载 JAXP 分发(请参阅参考资料一节),然后就会知道基本
JAXP 是什么。在包括的 jar (&) 中
只有六个类
!这个 API 会有多难哪?所有这些类(&*&* 包的一部分)
都位于现有语法分析器之上。这些类中的两个还用于错误处理。JAXP 比人们想象的要简单得多。那么,为什么还感到困惑哪?
Sun 的 JAXP 和 Sun 的语法分析器
JAXP 下载时包括 Sun 的语法分析器。所有 parser 器类作为 *&*& 包和相关子包的一部分位于 &*&& 档
案中。应该知道,该语法分析器(代码名为 Crimson)
不
是 JAXP 自身的一部分。它是 JAXP
版本
的一部分,但不是 JAXP API
的一部分。令人困惑吗?有一点。换这种方式想想:JDOM 与 Apache Xerces 语法分析器一起提供。该语法分析器不是 JDOM
的一部分,但由 JDOM 使用,所以包括它,以确保 JDOM 可以单独使用。JAXP 也是如此,但不象 JDOM 那样好表达:JAXP
与 Sun 的语法分析器一起提供,以便可以立即使用。但是,很多人将 Sun 的语法分析器中包括的类当成 JAXP API 的一部分。
例如,新闻组中一个常见的问题是:“怎样使用 JAXP 中的 类?其目的是什么?”这个答案可有些复杂。
首先,*& 类不是 JAXP 的一部分。它是 Sun 语法分析器的一部分。所以,这个问题从一开
始就给人以误导。其次,JAXP 的整个意义在于在处理语法分析器时提供供应商独立性。使用 JAXP 的同一代码可以与 Sun 的
XML 语法分析器、Apache 的 Xerces XML 语法分析器和 Oracle 的 XML 语法分析器一起使用。而使用特定于 Sun 的类是个坏
主意。这与 JAXP 的整个意义相背离。现在看出来这个问题怎样混淆概念了吗?语法分析器和 JAXP 发行版本(至少是 Sun 的
版本)中的 API 被混为一谈,开发人员将其中一个的类和特性当成是另一个的了,反之亦然。
旧和新
关于 JAXP,最后需要指出的是:使用 JAXP 有一些缺陷。例如,JAXP 只支持 SAX 1.0 和 DOM 第一层规范。SAX 2.0 从
2000 年 5 月起就完成,DOM 第二层规范支持甚至在大多数语法分析器中存在更长时间。DOM 第二层规范还没有完成,但确实
足够稳定以用于生产。这两个 API 的新版本都有重大改进,最明显的是对 XML 名称空间的支持。该支持还允许“XML Schema
确认”,这个与 XML 相关的另一热门技术。公平地说,当 JAXP 发布 1.0 最终发行版时,SAX 2.0 和 DOM 第一层规范都还没有
完成。但是,由于没有包括这些新版本,确实为开发人员带来很大不便。
还可以使用 JAXP,但是也可以等待 JAXP 1.1,它支持 SAX 2.0 和 DOM 第二层规范 。否则,将发现,JAXP 提供的优点以
SAX 和 DOM 最新版本中的功能为代价,并使应用程序更加难以编码。无论是否等待下一个 JAXP 发行版,都要留意这个问题。
如果将 JAXP 与语法分析器一起使用,而语法分析器支持的 DOM 和 SAX 版本比 JAXP 支持的要高,则可能会有类路径问题。
所以,事先留意一下,并且,一旦有 JAXP 1.1,马上升级。基本理解 JAXP 之后,让我们看一下 JAXP 依赖的 API:SAX 和
DOM。
从 SAX 开始
SAX (Simple API for XML)是用于处理 XML 的事件驱动方法。它基本由许多回调函数组成。例如,每当 SAX 语法分析器遇
到元素的开始标记时就调用 *&23。对于字符串,将调用 7&&*23 回调函数,然后在元素结束标记处调用
#23。还有很多回调函数用于文档处理、错误和其它词汇结构。现在知道这是怎么回事了。SAX 程序员实现一个定
义这些回调函数的 SAX 接口。SAX 还实现一个名为 #&+* 的类,该类实现所有这些回调函数,并提供所有这些回调方
法的缺省空实现。(提到这一点是因为它在后面讲到的 DOM 中很重要。)SAX 开发人员只需扩展这个类,然后实现需要插入
特定逻辑的方法。所以,SAX 的关键在于为这些不同的回调函数提供代码,然后允许语法分析器在适当的时候触发这些回调函
数中的每一个。
因此,典型的 SAX 过程如下:
用特定供应商的语法分析器实现创建一个 " &*& 实例
注册回调实现(例如,通过使用扩展 #&+* 的类)
开始进行语法分析,然后在触发回调实现时等待
JAXP 的 SAX 组件提供执行所有这些步骤的简单方式。如果没有 JAXP,SAX 语法分析器要直接从供应商类(如
&'7&*&*&*" &*&)进行实例化,或者必须使用名为 &*&,& 的帮助类。第一个方法的问题很
明显:不独立于供应商。第二个方法的问题在于类厂需要一个自变量,即要使用的语法分析器类的字符串名称(还是那个
Apache 类 &'7&*&*&*" &*&)。可以通过将不同语法分析器作为 "&)' 传递来更改语法分析器。使
用这种方法不必更改任何 import 语句,但是还是要重新编译类。这显然不是最佳解决方案。如果能够不重新编译类而更改语法
分析器,可能会简单得多,是不是这样呢?
JAXP 提供了更好的替代方法:它允许将语法分析器作为 Java 系统属性来提供。当然,当从 Sun 下载版本时,将得到使用 Sun
语法分析器的 JAXP 实现。可以从 Apache XML Web 站点下载在 Apache Xerces 上构建其实现的相同 JAXP 接口。因此(无
论哪一种情况),更改正在使用的语法分析器需要更改类路径设置,即从一种语法分析器实现更改到另一个,但是
不
要求重新
编译代码。这就是 JAXP 的魔力,或抽象性。
SAX 语法分析器一瞥
JAXP " &*&,& 类是能够轻易更改语法分析器实现的关键所在。必须创建这个类的新实例(等一会将讲到)。创建新
实例之后,类厂提供一个方法来获得支持 SAX 的语法分析器。在内部,JAXP 实现处理依赖于供应商的代码,使您的代码不受
影响。这个类厂还提供其它一些优秀特性。
除创建 SAX 语法分析器实例的基本工作之外,类厂还允许设置配置选项。这些选项影响所有通过类厂获得的语法分析器实例。
JAXP 1.0 中两个可用的功能是设置名称空间敏感性 (*(*1&(boolean awareness)),和打开确认
(*A)#)'(boolean validating))。请记住,一旦设置了这些选项,在调用该方法之后,它们将影响
所有
从 类厂获得的实例。
设置了类厂之后,调用 1" &*&23 将返回一个随时可用的 JAXP " &*& 类实例。这个类封装了一个下层的 SAX 语
法分析器(SAX 类 &'* &*& 的实例)。它还防止向语法分析器类添加任何特定于供应商的附加功能。(还记得以
前对 的讨论吗?)这个类可以开始进行实际的语法分析。以下清单显示如何创建、配置和使用 SAX 类厂。
清单 1. 使用 SAXParserFactory
剩余56页未读,继续阅读
资源评论
jordan146
- 粉丝: 48
- 资源: 273
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java毕业设计-基于SSM框架的传统服饰文化体验平台【代码+部署教程】
- 优化领域的模拟退火算法详解与实战
- NewFileTime-x64.zip.fgpg
- 基于Python和HTML的Chinese-estate-helper房地产爬虫及可视化设计源码
- 基于SpringBoot2.7.7的当当书城Java后端设计源码
- 基于Python和Go语言的开发工具集成与验证设计源码
- 基于Python与JavaScript的国内供应商管理系统设计源码
- aspose.words-20.12-jdk17
- 基于czsc库的Python时间序列分析设计源码
- 基于Java、CSS、JavaScript、HTML的跨语言智联平台设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功