使用jdom解析XML文件 ,转自163博客

使用JDOM解析XML

使用JDOM解析XML

JDOM是一个开源项目,不是JDK自带的包,使用之前到http://jdom.org下载最新版本的JDOM的jar包,将build目录的jdom.jar文件导入到项目classpath中。

JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析、生成、序列化及其它操作。

JDOM的常用API

SAXBulider类:JDOM中的SAXBulider的类会使用SAX来建立一个JDOM的解析树。它可以通过build()方法由指定的输入数据流建立一个文件,返回一个Document对象。

DOMBuilder类:JDOM中的DOMBuilder类会使用DOM来建立一个JDOM的解析树。它可以通过build()方法由指定的输入数据流建立一个文件,返回一个Document对象。

Document类:Document类的一个实例用来描述一个XML文档。这个Document是轻量级的,它可以包括文档类型、处理指令对象、根元素和注释对象等内容。

XMLOutputter类:一个XML文档可以以多种格式输出,在JDOM中最常用的是字节流。XMLOutputter类提供了这种属性,它将XML文档写入一个特定的OutputStream流中

Attribute类:可以使用Element类的getAttribute()方法来取得一个元素的属性,该方法会返回一个Attribute对象。Attribute类提供了getValue()方法,它将会以字符串的形式返回一个属性值。

实例1 通过JDOM创建一个XML文档,并保存到本地硬盘上

package zsb.jdon.xml;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jdom.*;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


public class UseJDOMWriteXML {

	public static void main(String[] args) {
		UseJDOMWriteXML w = new UseJDOMWriteXML();
		System.out.println("正在生成XML文档......");
		w.buildXML();
		System.out.println("完成");
	}

	public void buildXML() {
		// 创建XML文档的各个元素
		Element root, student, number, name, age;
		// 创建根元素
		root = new Element("student-info");
		// 创建各个子元素
		student = new Element("student");
		number = new Element("number");
		name = new Element("name");
		age = new Element("age");
		// 将根元素植入文档doc中
		Document doc = new Document(root);
		// 设置各个子元素的内容
		number.setText("001");
		name.setText("kelly");
		age.setText("25");
		// 将name,number,age子元素添加到student元素中
		student.addContent(name);
		student.addContent(number);
		student.addContent(age);
		// 将student元素添加到根元素root中
		root.addContent(student);
		// 声明文档格式对象
		Format format = Format.getCompactFormat();
		// 设置XML文件的字符集为GB2312
		format.setEncoding("GB2312");
		// 设置XML文件的缩进为4个空格
		format.setIndent("    ");
		// 将格式应用到输出流中
		XMLOutputter XMLOut = new XMLOutputter(format);
		// 将文档通过文件输出流生成studentinfo.xml文件
		try {
			XMLOut.output(doc, new FileOutputStream("/studentinfo.xml"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
实例二、使用JDOM读取XML文档

package zsb.jdon.xml;

import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;


public class UseJDOMReadXML {

	public static void main(String[] args) {
		// 实例化一个解析器对象
		SAXBuilder builder = new SAXBuilder();
		try {
			// 通过XML文件,构造文档对象
			Document read_doc = builder.build("studentinfo.xml");
			// 得到根元素
			Element stu = read_doc.getRootElement();
			// 得到student元素的列表
			List list = stu.getChildren("student");
			// 遍历student元素列表
			for (int i = 0; i < list.size(); i++) {
				// 获得并显示所有子元素
				Element e = (Element) list.get(i);
				String str_number = e.getChildText("number");
				String str_name = e.getChildText("name");
				String str_age = e.getChildText("age");
				System.out.println("---------------STUDENT----------------");
				System.out.println("number: " + str_number);
				System.out.println("name: " + str_name);
				System.out.println("age: " + str_age);
				System.out.println("--------------------------------------");
				System.out.println();
			}
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}


实例三、使用JDOM修改XML文档

package zsb.jdon.xml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


public class UseJDOMUpdateXML {

	public static void main(String[] args) {
		// 实例化一个解析器对象
		SAXBuilder builder = new SAXBuilder();
		try {
			// 通过已经存在的XML文件来构造一个文档对象
			Document doc = builder.build(new FileInputStream("books.xml"));
			// 通过文档对象得到根元素
			Element root = doc.getRootElement();
			// 得到根元素所有子元素的集合
			List books = root.getChildren();
			// 得到第一个book元素
			Element book = (Element) books.get(0);
			// 为第一个book元素添加一个属性
			Attribute a = new Attribute("hot", "true");
			book.setAttribute(a);
			// 得到book指定的子元素
			Element author = book.getChild("author");
			// 将作者修改为jerry king
			author.setText("jerry king");
			// 得到book指定的子元素
			Element price = book.getChild("price");
			// 修改价格,需要手动转换数据类型
			price.setText(Float.toString(99.0f));
			// 声明文档格式对象
			Format format = Format.getCompactFormat();
			// 设置XML文件的字符集为gb2312
			format.setEncoding("GB2312");
			// 设置XML文件的缩进为4个空格
			format.setIndent("    ");
			// 将格式应用到输出流中
			XMLOutputter outp = new XMLOutputter(format);
			// 通过输出流得到更新过的XML文件
			outp.output(doc, new FileOutputStream("newbooks.xml"));

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}


附:
Java下XML编程接口比较:DOM SAX JDOM JAXP(网络装载)

一、DOM (文档对象模型)
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
使用场合:一旦解析了文档还需多次访问这些数据;
硬件资源充足(内存、CPU)
 二、SAX
为解决DOM的问题,出现了SAX。
SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。
优点:不用事先调入整个文档,占用资源少;
SAX解析器代码比DOM解析器代码小,适于Applet,下载
缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
使用场合:Applet;
只需XML文档的少量内容,很少回头访问;
机器内存少;
 三、JDOM
为减少DOM、SAX的编码量,出现了JDOM;
优点:20-80原则,极大减少了代码量
使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan
四、JAPX
为多个XML解析器提供了统一编程接口
更换解析器,不用更改代码
使用场合:若不用Jdom,一般建议使用JAPX,将代码与各种解析器的实现细节隔离。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值