JDOM解析xml

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 工具
·org.xml. sax,用于对 XML 进行语法分析的 事件驱动的简单 API
·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在实际应用当中的不足之处。
这些不足之处主要在于 SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说, JAVA程序员在使用时来用起来总觉得不太方便。
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
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();
		}
	}
}










运行结果为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值