JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果, 2000 年初在类似于
Apache协议的许可下,JDOM作为一个开放源代码项目正式开始研发了。它已成长为包含来自广泛的 Java 开发人员的投稿、集中反馈及错误修复的系统,并致力于建立一个完整的基于 Java 平台的解决方案,通过 Java 代码来访问、操作并输出 XML 数据。
虽然许多Java 开发人员每天都在使用 XML,Sun 却在将 XML 整合进 Java 平台方面落后了。因为在 XML 成为从商家对商家集成到 Web 站点内容流水化等方面的关键技术之前,Java 2 平台就已经非常流行了。
Sun已经使用
JSR过程使之成为现存 XML
API的鼻祖,这一点已被广泛接受。目前最显著的是加入了
JAXP(用于 XML
语法分析的 Java API),其中包含了三个软件包:
·org.w3c.dom ,W3C 推荐的用于 XML 标准规划
文档对象模型的 Java 工具
·javax.xml.parsers ,工厂化工具,允许
应用程序开发人员获得并配置特殊的语法分析器工具 JDOM 能够替换
org.w3c.dom软件包来有计划地操作 XML 文档
JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(
方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。
Jdom是用
Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin
公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。
在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。
JDOM在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。
DOM的缺点主要是来自于由于Dom是一个接口定义语言(
IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。
在 JDOM 中,XML 元素就是 Element 的实例,XML 属性就是 Attribute 的实例,XML 文档本身就是 Document 的实例。
因为 JDOM 对象就是像
Document、Element 和 Attribute 这些类的直接实例,因此创建一个新 JDOM 对象就如在 Java 语言中使用 new 操作符一样容易。JDOM 的使用是直截了当的。
JDOM 使用标准的 Java 编码模式。只要有可能,它使用 Java new 操作符而不故弄玄虚使用复杂的工厂化模式,使对象操作即便对于初学用户也很方便。
下面我们来通过一个小例子来说明它的使用:
book.java
book.xml
JDOMTest.java
下面我们来通过一个小例子来说明它的使用:
book.java
package myPack;
public class book {
private String id;
private String name;
private String author;
private String year;
private String price;
private String sort;
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the author
*/
public String getAuthor() {
return author;
}
/**
* @param author the author to set
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* @return the year
*/
public String getYear() {
return year;
}
/**
* @param year the year to set
*/
public void setYear(String year) {
this.year = year;
}
/**
* @return the price
*/
public String getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(String price) {
this.price = price;
}
/**
* @return the sort
*/
public String getSort() {
return sort;
}
/**
* @param sort the sort to set
*/
public void setSort(String sort) {
this.sort = sort;
}
}
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>马丁</author>
<year>2014</year>
<price>85</price>
</book>
<book id="2">
<name>斗破苍穹</name>
<year>2012</year>
<price>89</price>
<sort>1</sort>
</book>
</bookstore>
JDOMTest.java
package myPack;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
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 myPack.book;
public class JDomTest {
private static ArrayList<book> booksList = new ArrayList<book>();//通过ArrayList流进行数据的传输,将xml的数据写入到book对象中
/**
* @param args
*/
public static void main(String[] args) {
//进行对book.xml文件的JDOM解析
//创建SAXBuilder对象
SAXBuilder saxBuilder = new SAXBuilder();
InputStream in;
try {
// 2.创建一个输入流,将xml文件加载到输入流中
in = new FileInputStream("book.xml");
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
Document document = saxBuilder.build(isr);
// 4.通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement();
// 5.获取根节点下的子节点的List集合
List<Element> bookList = rootElement.getChildren();
// 继续进行解析
for(Element book :bookList){
book bookEntity=new book();
System.out.println("======开始解析第"+(bookList.indexOf(book)+1)+"本书=======");
//解析book的属性集合
List<Attribute> attrList=book.getAttributes();
/**
* 知道结点下属性名称时,获取结点值
* book.getAttributeValue("id");
*/
//遍历不知道节点下属性名称是
for(Attribute attr : attrList){
//获取属性名
String attrName=attr.getName();
//获取属性值
String attrValue=attr.getValue();
System.out.println("属性名:"+attrName+"-----属性名"+attrValue);
if(attrName.equals("id"))
{
bookEntity.setId(attrValue);
}
}
//对节点的子节点的节点么以及结点值的遍历
List<Element> bookChilds=book.getChildren();
for(Element child : bookChilds){
System.out.println("节点名:"+child.getName()+"-----节点值:"+child.getValue());
if(child.getName().equals("name"))
{
//写入book对象中
bookEntity.setName(child.getValue());
}
else if(child.getName().equals("author"))
{
bookEntity.setAuthor(child.getValue());
}
else if(child.getName().equals("year"))
{
bookEntity.setYear(child.getValue());
}
else if(child.getName().equals("price"))
{
bookEntity.setPrice(child.getValue());
}
else if(child.getName().equals("sort"))
{
bookEntity.setSort(child.getValue());
}
}
System.out.println("======开始结束第"+(bookList.indexOf(book)+1)+"本书=======");
booksList.add(bookEntity);
bookEntity=null;
System.out.println(booksList.size());
System.out.println(booksList.get(0).getId());
System.out.println(booksList.get(0).getName());
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (JDOMException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果为: