`
JavaTestJava
  • 浏览: 54685 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java的XML文件操作之DOM入门篇 (3)

阅读更多


2.DOM实例

有了上面的介绍,相信你对DOM理解的更多了吧。下面的例子将让你对DOM更加熟悉起来。

先说说这个例子到底要做的是什么吧,我们希望在一个名为link.xml文件中保存了一些URL地址,通过一个简单的程序,我们可以通过DOM把这些URL读出并显示出来,也可以反过来向这个XML文件中写入加入的URL地址。很简单,却很实用,也足够来例示DOM的绝大部分用法了。

XML文件本身不复杂,就不给出它的DTD了。link.xml:

JSP Insider

http://www.jspinsider.com

JSP Insider

2

1

2001

A JSP information site.

The makers of Java

http://java.sun.com

Sun Microsystems

3

1

2001

Sun Microsystem's website.

The standard JSP container

http://jakarta.apache.org

Apache Group

4

1

2001

Some great software.

第一个程序我们称为xmldisplay.java,具体的程序清单可以在附件中找到。主要的功能就是读取这个XML文件中各个节点的内容,然后在格式化输出在System.out上,我们来看看这个程序:

import javax.xml.parsers.*;

import org.w3c.dom.*;

这是引入必要的类,因为在这里使用的是Sun所提供的XML解析器,因而需要引入java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具体实现。org.w3c.dom包中定义了w3c所制定的DOM接口。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document doc=builder.parse("links.xml");

doc.normalize();

除了上面讲到的,还有一个小技巧,对Document对象调用normalize(),可以去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象。否则你得到的DOM树可能并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。

NodeList links =doc.getElementsByTagName("link");

刚才说过,XML文档中的空白符也会被作为对象映射在DOM树中。因而,直接调用Node方法的getChildNodes方法有时候会有些问题,有时不能够返回所期望的NodeList对象。解决的办法是使用Element的getElementByTagName(String),返回的NodeLise就是所期待的对象了。然后,可以用item()方法提取想要的元素。

for (int i=0;i
Element link=(Element) links.item(i);

System.out.print("Content: ");

System.out.println(link.getElementsByTagName("text").item(0).getFirstChild().getNodeValue());

System.out.print("URL: ");

System.out.println(link.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());

System.out.print("Author: ");

System.out.println(link.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());

System.out.print("Date: ");

Element linkdate=(Element) link.getElementsByTagName("date").item(0);

String day=linkdate.getElementsByTagName("day").item(0).getFirstChild().getNodeValue();

String month=linkdate.getElementsByTagName("month").item(0).getFirstChild().getNodeValue();

String year=linkdate.getElementsByTagName("year").item(0).getFirstChild().getNodeValue();

System.out.println(day+"-"+month+"-"+year);

System.out.print("Description: ");

System.out.println(link.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());

System.out.println();

}

上面的代码片断就完成了对XML文档内容的格式化输出。只要注意到一些细节的问题,比如getFirstChile()方法和getElementsByTagName()方法的使用,这些还是比较容易的。

下面的内容,就是在修改了DOM树后重新写入到XML文档中去的问题了。这个程序名为xmlwrite.java。在JAXP1.0版本中,并没有直接的类和方法能够处理XML文档的写入问题,需要借助其它包中的一些辅助类。而在JAXP1.1版本中,引入了对XSLT的支持,所谓XSLT,就是对XML文档进行变换(Translation)后,得到一个新的文档结构。利用这个新加入的功能,我们就能够很方便的把新生成或者修改后的DOM树从新写回到XML文件中去了,下面我们来看看代码的实现,这段代码的主要功能是向links.xml文件中加入一个新的link节点:

import javax.xml.parsers.*;

import javax.xml.transform.*;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;

新引入的java.xml.transform包中的几个类,就是用来处理XSLT变换的。

我们希望在上面的XML文件中加入一个新的link节点,因而首先还是要读入links.xml文件,构建一个DOM树,然后再对这个DOM树进行修改(添加节点),最后把修改后的DOM写回到links.xml文件中:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document doc=builder.parse("links.xml");

doc.normalize();

//---取得变量----

String text="Hanzhong's Homepage";

String url="www.hzliu.com";

String author="Hzliu Liu";

String discription="A site from Hanzhong Liu, give u lots of suprise!!!";

为了看清重点,简化程序,我们把要加入的内容硬编码到记忆String对象中,而实际操作中,往往利用一个界面来提取用户输入,或者通过JDBC从数据库中提取想要的内容。

Text textseg;

Element link=doc.createElement("link");

首先应该明了的是,无论什么类型的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创建都是通过Document对象中的createXXX()方法来创建的(XXX代表具体要创建的类型),因此,我们要向XML文档中添加一个link项目,首先要创建一个link对象:

Element linktext=doc.createElement("text");

textseg=doc.createTextNode(text);

linktext.appendChild(textseg);

link.appendChild(linktext);

Element linkurl=doc.createElement("url");

textseg=doc.createTextNode(url);

linkurl.appendChild(textseg);

link.appendChild(linkurl);

Element linkauthor=doc.createElement("author");

textseg=doc.createTextNode(author);

linkauthor.appendChild(textseg);

link.appendChild(linkauthor);

java.util.Calendar rightNow = java.util.Calendar.getInstance();

String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));

String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));

String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));

Element linkdate=doc.createElement("date");

Element linkdateday=doc.createElement("day");

textseg=doc.createTextNode(day);

linkdateday.appendChild(textseg);

Element linkdatemonth=doc.createElement("month");

textseg=doc.createTextNode(month);

linkdatemonth.appendChild(textseg);

Element linkdateyear=doc.createElement("year");

textseg=doc.createTextNode(year);

linkdateyear.appendChild(textseg);

linkdate.appendChild(linkdateday);

linkdate.appendChild(linkdatemonth);

linkdate.appendChild(linkdateyear);

link.appendChild(linkdate);

Element linkdiscription=doc.createElement("description");

textseg=doc.createTextNode(discription);

linkdiscription.appendChild(textseg);

link.appendChild(linkdiscription);

创建节点的过程可能有些千篇一律,但需要注意的地方是,对Element中所包含的text(在DOM中,这些text也是代表了一个Node的,因此也必须为它们创建相应的node),不能直接用Element对象的setNodeValue()方法来设置这些text的内容,而需要用创建的Text对象的setNodeValue()方法来设置文本,这样才能够把创建的Element和其文本内容添加到DOM树中。看看前面的代码,你会更好的理解这一点:

doc.getDocumentElement().appendChild(link);

最后,不要忘记把创建好的节点添加到DOM树中。Document类的getDocumentElement()方法,返回代表文档根节点的Element对象。在XML文档中,根节点一定是唯一的。

TransformerFactory tFactory =TransformerFactory.newInstance();

Transformer transformer = tFactory.newTransformer();

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new java.io.File("links.xml"));

transformer.transform(source, result);

然后就是用XSLT把DOM树输出了。这里的TransformerFactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。实现的方法和DocumentBuilderFactory相同,这儿就不赘述了。Transformer类的transfrom方法接受两个参数、一个数据源Source和一个输出目标Result。这里分别使用的是DOMSource和StreamResult,这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文件中去了。
分享到:
评论

相关推荐

    DOM4J格式化XML

    【文件名称】"UML入门教程.pptx"看似与主题"DOM4J格式化XML"不直接相关,但可以假设它是博文作者提供的补充材料,可能是为了帮助读者更好地理解XML处理背后的逻辑,通过UML(统一建模语言)来展示类图、序列图或其他...

    java中xml和excel的基本操作

    本篇将详细介绍Java中对XML和Excel进行基本操作的方法。 XML操作: 1. **解析XML**:Java提供了DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)三种解析方式。DOM一次性...

    利用XMLBean轻轻松松读写XML-入门教程

    本篇入门教程将介绍如何利用 XMLBean 进行 XML 的读写,以及相关的准备工作。 首先,XML 在 Java 应用中扮演着重要角色,常用于数据存储和交换。SAX 和 DOM 是 Java 提供的两种主要的 XML 解析方式。SAX(Simple ...

    dom4j入门例子

    **DOM4J入门详解** DOM4J是一款强大的Java XML API,它提供了丰富的DOM、SAX、JDOM等接口,使得处理XML文档变得更为便捷。...希望这篇DOM4J入门教程能帮助你快速上手,祝你在XML处理的道路上越走越远!

    XML解析入门之JDOM(一)

    本篇主要介绍XML解析的基础知识,特别是针对JDOM库的使用,一个Java平台上的XML处理库。 JDOM是Java Document Object Model的缩写,它是为了解决DOM(Document Object Model)在Java中的性能问题而设计的。JDOM提供...

    xml手册用来补充学习java的语言,循序渐进的从基础学起,帮住大家学习新的知识

    入门篇可能涵盖了XML的基础概念,如XML的语法结构,包括XML声明、元素、属性、文本内容、注释以及处理指令。它可能会解释如何创建一个基本的XML文档,并介绍验证XML文档的重要性,如使用DTD(Document Type ...

    XML编程从入门到精通

    本篇将深入探讨XML编程的基础概念、语法特性以及实际应用,帮助你从入门到精通。 1. XML基础: - **语法规范**:XML文档必须有且只有一个根元素,所有元素都以尖括号包围,如`<element>`,属性值需用引号包围。 -...

    Java获取XML节点总结之读取XML文档节点的方法

    DOM4J是一个流行的Java XML API,提供了丰富的功能来读取、写入和操作XML文档。本篇文章将详细介绍如何使用DOM4J库来读取XML文档中的节点。 首先,要使用DOM4J,你需要在项目中引入其对应的JAR文件。你可以从官方...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XML创建了标识,而DOM的作用就是告诉script如何在浏览器窗口中操作和显示这些标识 上面我们已经简要的讲述了一些XML的基本原理,我们来看看它们之间的关联以及它们是如何工作的,先看这里一张图: 1.XML描述...

    xml入门课件(一)

    本篇“XML入门课件(一)”提供了深入浅出的教程,适合初学者了解和掌握XML的基本概念和用法。 1. **XML的基本原理**: - XML是一种自描述性语言,其目的是通过提供一套规则来创建具有明确结构的数据。 - XML文档...

    vtd-xml相关资料.zip

    3. **基于多核处理器的VTD_XML解析性能优化_郭宪勇.caj** 和 **基于多核处理器的VTD_XML节点查询执行性能优化_郭宪勇.caj**:这两篇文章可能探讨了如何利用多核处理器来进一步提升VTD-XML的性能,包括解析速度和查询...

    用排序的调实现对XML的读写

    本篇文章将深入探讨如何利用排序方法来实现XML的读写及删除操作。 一、XML基础 XML文档由元素(Element)、属性(Attribute)、文本内容(Text Content)等构成,具有自描述性。元素是最基本的构建单元,通常包含...

    如何才算掌握Java(J2SE篇

    ### 如何才算真正掌握Java(J2SE篇) 在当今的软件开发领域中,Java作为一门重要的编程语言,被广泛应用于各种应用场景之中。对于初学者来说,如何判定自己是否已经掌握了Java,特别是在J2SE(Java 2 Standard ...

    java lecture note(Java学习笔记)

    ### 一、Java入门与基本语法 #### 课程概述 Java课程旨在介绍面向对象编程的基本原则和设计,将Java作为主要的编程语言进行教学,使学生能够掌握基础的Java编程知识,为成为Sun Certified Java Programmer(SCJP)做...

    网络编程基础篇之 Java Scrip

    【网络编程基础篇之 JavaScript】深入解析 JavaScript,一种轻量级的解释型编程语言,是Web开发中的核心语言,尤其在网络编程中扮演着至关重要的角色。本篇将带你从入门到精通,全面掌握JavaScript的基础知识及其在...

    java新手教程--入伍篇

    - **XML基础与应用**:讲解XML(可扩展标记语言)的概念、结构与用途,探讨XML数据处理技术,如DOM、XPath等在Java中的应用,以及XML Schema的数据类型定义。 #### 六、JavaScript入门 - **JavaScript语言特征**:...

    常用java资料下载网址

    在Java开发中,XML被广泛应用于配置文件、数据交换格式等领域。通过提供的链接可以看到,有关于XML的视频教程和资料,这可以帮助开发者深入理解XML的基本概念、语法结构及应用实践。 ### 关键知识点二:AJAX技术 ...

    java 核心(上下册)

    8. **XML处理**:涵盖DOM,SAX,PULL解析器以及JAXB等XML处理技术。 9. **JavaSE 8新特性**:包括Lambda表达式,函数式接口,Stream API,日期/时间API等新功能的使用。 通过对《Java核心》上下两册的学习,开发者...

    JAXB简易教程

    JAXB的主要目的是简化XML数据处理,让开发者能够轻松地在XML文档和Java类之间进行互操作。此教程旨在为开发人员和系统维护人员提供一个快速入门的指南,帮助他们理解和使用JAXB的基本功能。 **2. 开发指南** **2.1...

    JavaWeb开发教程——入门与提高篇(含PDF课件和源码)

    本教程"JavaWeb开发教程——入门与提高篇"旨在为初学者提供一个全面的学习路径,同时也为有一定基础的开发者提供进阶知识。教程包含了PDF课件和源码,使学习者能够理论结合实践,更深入地理解JavaWeb开发的核心概念...

Global site tag (gtag.js) - Google Analytics