使用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;实例二、使用JDOM读取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();
}
}
}
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,将代码与各种解析器的实现细节隔离。