JDOM解析xml

来源:互联网 发布:中国食品出口美国数据 编辑:程序博客网 时间:2024/06/04 01:02
JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果, 2000 年初在类似于Apache协议的许可下,JDOM作为一个开放源代码项目正式开始研发了。它已成长为包含来自广泛的 Java 开发人员的投稿、集中反馈及错误修复的系统,并致力于建立一个完整的基于 Java 平台的解决方案,通过 Java 代码来访问、操作并输出 XML 数据。
虽然许多Java 开发人员每天都在使用 XML,Sun 却在将 XML 整合进 Java 平台方面落后了。因为在 XML 成为从商家对商家集成到 Web 站点内容流水化等方面的关键技术之前,Java 2 平台就已经非常流行了。Sun已经使用JSR过程使之成为现存 XMLAPI的鼻祖,这一点已被广泛接受。目前最显著的是加入了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();}}}
运行结果为:


0 0
原创粉丝点击