XML From IBM Developer works<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
简介:该文简要描述了DOM的概念和内部逻辑结构,给出了DOM文档操作和XML文件互相转换的java实现过程。郭洪锋:主要从事UNIX系统下分布式应用的开发和研究。您可以通过电子邮件ghf_email@sohu.com 和他联系
1. DOM简介
目前,W<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3" unitname="C">3C</chmetcnv>已于<chsdate w:st="on" isrocdate="False" islunardate="False" day="13" month="11" year="2000"><span lang="EN-US">2000</span>年<span lang="EN-US">11</span>月<span lang="EN-US">13</span>日</chsdate>推出了规范DOM level 2。文档对象模型(DOM)是HTML和XML文档的编程接口规范,它与平台和语言是无关的,因而可以用各种语言在各种平台上实现。该模型定义了THML和XML文件在内存中的逻辑结构(即为文档),提供了访问、存取THML和XML文件的方法。利用DOM规范,可以实现DOM 文档和XML之间的相互转换,遍历、操作相应DOM文档的内容。可以说,要自由的操纵XML文件,就要用到DOM规范。
2. DOM内部逻辑结构
DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。DOM的文档节点有Document、Element、Comment、Type等等节点类型,其中每一个DOM文档必须有一个Document节点,并且为节点树的根节点。它可以有子节点,或者叶子节点如Text节点、Comment节点等。任何的格式良好的XML文件中的每一个元素均有DOM文档中的一个节点类型与之对应。利用DOM接口将XML文件转化成DOM文档后,我们就可以自由的处理XML文件了。
3. java中的DOM接口
DOM规范提供的API的规范,目前Sun公司推出的jdk1.4测试版中的java API遵循了 DOM level 2 Core推荐接口的语义说明,提供了相应的java语言的实现。
在org.xml.dom中,jkd1.4提供了Document、DocumentType、Node、NodeList、Element、Text等接口,这些接口均是访问DOM文档所必须的。我们可以利用这些接口创建、遍历、修改DOM文档。
在javax.xml.parsers中,jkd1.4提供的DoumentBuilder和DocumentBuilderFactory组合可以对XML文件进行解析,转换成DOM文档。
在javax.xml.transform.dom和javax.xml.transform.stream中,jdk1.4提供了DOMSource类和StreamSource类,可以用来将更新后的DOM文档写入生成的XML文件中。
4. 例程
4.1 将XML文件转化成DOM文档
这个过程是获得一个XML文件解析器,解析XML文件转化成DOM文档的过程。
Jdk1.4中,Document接口描述了对应于整个XML文件的文档树,提供了对文档数据的访问,是该步骤的目标。Document接口可以从类DocumentBuilder中获取,该类包含了从XML文档获得DOM文档实例的API。XML的解析器可以从类DocumentBuilderFactory中获取。在jdk1.4中,XML文件转化成DOM文档可以有如下代码实现:
// 获得一个XML文件的解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 解析XML文件生成DOM文档的接口类,以便访问DOM。
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse( new File(FileName) );
|
4.2 遍历DOM文档
获得接口类document实例后,可以对DOM的文档树进行访问。要遍历DOM文档,首先要获得Root元素。然后获得Root元素的子节点列表。这里通过递归的方法实现遍历的目的。
//获得Root元素
Element element = document.getDocumentElement();
//获得Root元素的子节点列表
nodelist = element.getChildNodes();
//用递归方法实现DOM文档的遍历
GetElement(nodelist);
其中GetElement方法实现如下:
public void GetElement(NodeList nodelist){
Node cnode;
int i,len;
String str;
if(nodelist.getLength() == 0){
// 该节点没有子节点
return;
}
for(i=0;i 1)
System.out.println(" "+str+" "+len);
}
}
}
|
注意:上面的代码只是显示Node类型和Text类型的对象。它们的类型标识分别是1和3。
4.3 修改DOM文档
修改DOM文档的API在DOM level 2 Core规范中做了说明,jkd1.4中的org.xml.dom中实现了这些API。修改DOM文档操作主要集中在Document、Element、Node、Text等类中,这里给出的例子中是在解析出的DOM文档中增加一系列对象,对应与在XML文件中增加一条记录。
// 获得Root对象
Element root = document.getDocumentElement();
// 在DOM文档中增加一个Element节点
Element booktype = document.createElement("COMPUTES");
//将该节点转化成root对象的子节点
root.appendChild(cdrom);
//在DOM文档中增加一个Element节点
Element booktitle = document.createElement("Title");
// 将该节点转化成booktype对象的子节点
booktype.appendChild(booktitle);
// 在DOM文档中增加一个Text节点
Text bookname = document.createTextNode("understand Corba");
// 将该节点转化成bookname对象的子节点
booktitle.appendChild(bookname);
|
4.4 将DOM文档转化成XML文件
// 获得将DOM文档转化为XML文件的转换器,在jdk1.4中,有类TransformerFactory
// 来实现,类Transformer实现转化API。
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
// 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。
DOMSource source = new DOMSource(document);
// 获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,可以是XML文件,文本文件,HTML文件。这里为一个XML文件。
StreamResult result = new StreamResult(new File( “ text.xml ” ));
// 调用API,将DOM文档转化成XML文件。
transformer.transform(source,result);
|
这里提供了该例程的完整程序,该例程在windows 2000中jdk1.4环境中运行通过。
以上给出了一个例子,读者可以从中了解到对DOM操作的思路。因为对DOM的操作均遵循了DOM规范,所以也适用于其它语言对DOM的处理。
参考资料:
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 (jaxp.jar
) 中只有六个类!这个 API 会有多难哪?所有这些类(javax.xml.parsers
包的一部分)都位于现有语法分析器之上。这些类中的两个还用于错误处理。JAXP 比人们想象的要简单得多。那么,为什么还感到困惑哪?
Sun 的 JAXP 和 Sun 的语法分析器
JAXP 下载时包括 Sun 的语法分析器。所有 parser 器类作为 com.sun.xml.parser
包和相关子包的一部分位于 parser.jar
档案中。应该知道,该语法分析器(代码名为 Crimson)不是 JAXP 自身的一部分。它是 JAXP 版本的一部分,但不是 JAXP API 的一部分。令人困惑吗?有一点。换这种方式想想:JDOM 与 Apache Xerces 语法分析器一起提供。该语法分析器不是 JDOM 的一部分,但由 JDOM 使用,所以包括它,以确保 JDOM 可以单独使用。JAXP 也是如此,但不象 JDOM 那样好表达:JAXP 与 Sun 的语法分析器一起提供,以便可以立即使用。但是,很多人将 Sun 的语法分析器中包括的类当成 JAXP API 的一部分。例如,新闻组中一个常见的问题是:“怎样使用 JAXP 中的 XMLDocument
类?其目的是什么?”这个答案可有些复杂。
首先,com.sun.xml.tree.XMLDocument
类不是 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 语法分析器遇到元素的开始标记时就调用 startElement()
。对于字符串,将调用 characters()
回调函数,然后在元素结束标记处调用 endElement()
。还有很多回调函数用于文档处理、错误和其它词汇结构。现在知道这是怎么回事了。SAX 程序员实现一个定义这些回调函数的 SAX 接口。SAX 还实现一个名为 HandlerBase
的类,该类实现所有这些回调函数,并提供所有这些回调方法的缺省空实现。(提到这一点是因为它在后面讲到的 DOM 中很重要。)SAX 开发人员只需扩展这个类,然后实现需要插入特定逻辑的方法。所以,SAX 的关键在于为这些不同的回调函数提供代码,然后允许语法分析器在适当的时候触发这些回调函数中的每一个。
因此,典型的 SAX 过程如下:
-
用特定供应商的语法分析器实现创建一个
SAXParser
实例
-
注册回调实现(例如,通过使用扩展
HandlerBase
的类)
-
开始进行语法分析,然后在触发回调实现时等待
JAXP 的 SAX 组件提供执行所有这些步骤的简单方式。如果没有 JAXP,SAX 语法分析器要直接从供应商类(如 org.apache.xerces.parsers.SAXParser
)进行实例化,或者必须使用名为 ParserFactory
的帮助类。第一个方法的问题很明显:不独立于供应商。第二个方法的问题在于类厂需要一个自变量,即要使用的语法分析器类的字符串名称(还是那个 Apache 类 org.apache.xerces.parsers.SAXParser
)。可以通过将不同语法分析器作为font-size: 9pt; font-family: helvetica,helv,a
分享到:
相关推荐
### XML IBM教程 v01 知识点概览 #### 一、课程介绍与目标概述 本教程由IBM提供,是一门专为Java程序员设计的深入学习XML及其相关技术的课程。通过本教程的学习,参与者将能够掌握XML的基础知识及一系列重要的衍生...
《XML.NET Web developer's guide》是一本专为.NET平台上的Web开发者设计的指南,它深入浅出地介绍了如何利用XML技术进行Web应用开发。XML(eXtensible Markup Language)是一种用于标记数据的语言,它的核心目标是...
IBM作为全球知名的科技巨头,其官方提供的XML讲解无疑是最权威且实用的学习资源之一。XML的设计目标是为了传输和存储数据,而非显示数据,这与HTML(超文本标记语言)主要用于网页展示有着本质的区别。 XML的核心...
IBM作为一家全球知名的科技公司,提供了丰富的XML学习资源,帮助初学者理解并掌握这一重要技术。 XML的核心特性包括: 1. **可扩展性**:XML允许用户自定义标签,以适应各种特定的数据结构需求,这是它区别于HTML...
根据提供的信息,我们可以总结出以下关于IBM XML模拟题的相关知识点: ### 1. W3C DOM Core 接口定义 W3C DOM (Document Object Model) Core 接口定义了一个最小集,用于访问和操作文档对象。选项 A 正确地指出了...
在SolidWorks中,XML文件被用来存储各种类型的数据,如工程图、零部件或装配体的配置信息,以及用户自定义的属性等。当你从SolidWorks中导出或提取.xml文件时,这些文件通常包含了丰富的设计信息,方便与其他软件...
6. **IBM的XML扩展**:IBM作为Java的重要贡献者,其JDK可能包含了一些特定的XML处理扩展,如性能优化或额外的功能。不过,具体特性需要查阅IBM官方文档了解。 在提供的文件列表中,尽管没有XML解析相关的代码或文档...
Oracle XML DB Developer's Guide 是一份由Oracle公司官方发布的指南,它为开发者提供了在Oracle数据库中加载、存储、生成、操作、管理、访问和查询XML数据的指导和示例。这份文档是Oracle XML DB 10g Release 2版本...
User user = (User) xstream.fromXML(bais); ``` 这样,XML字符串就会被转换回User对象。 XStream还提供了许多高级功能,比如自定义转换器来改变默认的XML表示,或者处理复杂的继承关系。此外,为了提高安全性...
### XML Developer's Guide知识点概述 #### 一、文档简介与约定 - **文档目的**:本文档旨在为开发者提供关于XML及其在Borland JBuilder中的应用指南。 - **文档结构**:文档由多个章节组成,每个章节针对XML的不同...
《XML .NET Developer's Guide》是一本专门为.NET开发者设计的指南,它深入探讨了XML在.NET框架中的使用和开发技术。这本书结合了理论知识与实际源码,为读者提供了全面的学习资源,帮助开发者掌握XML的解析、创建、...
标题与描述中的关键词“Rational Application Developer programmer”指向了IBM Rational Application Developer(RAD)这款集成开发环境(IDE),主要用于构建企业级应用,如Java、Web、XML、数据库、EJB、Struts、...
IBM Redbook XM341是一门专注于XML编程和相关技术的课程,旨在为学习者提供扎实的理论基础和实际操作技能。通过该课程,参与者可以掌握XML的核心概念,了解并熟练运用XML处理、转换和展示的各种工具,以及在Web服务...
标题中的“ibm 2010 面试题(uml转xml)”是指IBM公司在2010年面试中提出的一个技术问题,涉及到将统一建模语言(UML)模型转换为可扩展标记语言(XML)的技能。UML是一种用于软件工程的图形化建模语言,而XML是一种...
Oracle XML DB Developer's Guide 11g Release 2 (11.2) 是一本专为开发者设计的指南,旨在详细阐述如何在Oracle数据库中高效地处理XML数据。这本书由Drew Adams作为主要作者,众多其他专家共同贡献,涵盖了2002年至...
Oracle XML Developer’s Kit (XDK) 是一组由Oracle公司提供的用于处理XML文档的工具集合,主要功能包括读取、操作、转换和展示XML数据。XDK支持多种编程语言,如C、PL/SQL、C++以及Java,为开发人员提供了在不同...
2. **XML解析**:IBM的JAR文件可能包含用于解析和生成XMI文档的类库。这些类库可能使用DOM(Document Object Model)、SAX(Simple API for XML)或StAX(Streaming API for XML)等解析技术。 3. **UML与XMI的映射...
Oracle XML Developer's Kit Programmer's Guide 11g Release 2 (11.2) 是一个重要的文档,旨在为开发者提供关于在Oracle环境中处理XML的详细指南。这份文档涵盖了Oracle公司提供的XML开发工具包的各项功能和用法,...
IBM作为全球领先的IT公司,提供了丰富的XML相关培训资源,旨在帮助学习者深入理解和掌握这一技术。在这个“IBM XML课件”中,你将获得一份详尽、丰富的学习资料,涵盖了XML的基础到高级应用。 XML的设计目标是传输...
Oracle 9i XML Developer’s Kits Guide - XDK Release 2 (9.2) 是 Oracle 公司发布的一本关于 XML 开发者的指南,该指南详细介绍了 Oracle 9i XML 开发者套件的使用和实现。 Oracle 9i XML 开发者套件是 Oracle ...