** XML ** From IBM Developer works
简介:该文简要描述了 DOM 的概念和内部逻辑结构,给出了 DOM 文档操作和 XML 文件互相转换的 java 实现过程。郭洪锋:主要从事 UNIX 系统下分布式应用的开发和研究。您可以通过电子邮件 [email protected] 和他联系
1. DOM 简介
目前, W 3C 已于 2000 年 11 月 13 日 推出了规范 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 <SPAN style="FONT-SIZE: 9pt; mso-hansi-font-family: 'helvetica,helv,arial,sans-serif'; mso