服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用jdom操作xml文件


  java + xml = jdom ! 
这就是jdom设计者的目标。如果你曾经使用过烦人的sax或是dom来处理xml,你就会知道为什么要有jdom或者是jaxb。在今年(2002)的javaone会议上jdom的主要创始人jason hunter有一篇精彩的演讲介绍了jdom技术,题目就是jdom makes xml easy。 
获得并安装jdom 
在http://jdom.org可以下载jdom的最新版本。以jdom beta8的2进制版本为例。下载后解压缩,jdom的jar文件就是build目录下的文件jdom.jar,将之加入类路径。另外jdom还需要lib目录下那些jar文件如xerces.jar,jaxp.jar的支持。如果在使用中出现以下错误: 
java.lang.nosuchmethoderror 
或 
java.lang.noclassdeffounderror: org/xml/sax/saxnotrecognizedexception 
你需要保证xerces.jar文件在classpath中位于其他xml类,如jaxp或crimson之前,这些类文件,包括以前老版本的xerces,可能不支持sax2.0或dom level 2。于是导致了上面的错误。 

一个简单的例子 
jdom的处理方式有些类似于dom,但它主要是用sax实现的,你不必担心处理速度和内存的问题。另外,jdom中几乎没有接口,的类全部是实实在在的类,没有类工厂类的。

下面是实例用的xml文件:

<?xml version="1.0" encoding="gbk"?>
<书库>
<书>
<书名>java编程入门</书名>
<作者>张三</作者>
<出版社>电子出版社</出版社>
<价格>35.0</价格>
<出版日期>2002-10-07</出版日期>
</书>
<书>
<书名>xml在java中的应用</书名>
<作者>李四</作者>
<出版社>希望出版社</出版社>
<价格>92.0</价格>
<出版日期>2002-10-07</出版日期>
</书>
</书库>

下面是操作xml文件的bean:
package xml;
/**
* xml的读写操作bean
*/
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class xmlbean{
private string bookname,author,pub,price,pubdate;
public string getbookname() { return bookname;}
public string getauthor() { return author;}
public string getpub() { return pub;}
public string getprice() { return price;}
public string getpubdate() { return pubdate;}
public void setbookname(string bookname) { this.bookname =bookname ; }
public void setauthor(string author) { this.author =author; }
public void setpub(string pub) { this.pub =pub ; }
public void setprice(string price) { this.price =price ; }
public void setpubdate(string pubdate) { this.pubdate =pubdate ; }
public xmlbean(){}
/**
* 读取xml文件所有信息
*/
public vector loadxml(string path)throws exception{
vector xmlvector = null;
fileinputstream fi = null;
try{
fi = new fileinputstream(path);
xmlvector = new vector();
saxbuilder sb = new saxbuilder();
document doc = sb.build(fi);
element root = doc.getrootelement(); //得到根元素
list books = root.getchildren(); //得到根元素所有子元素的集合
element book =null;
xmlbean xml =null;
for(int i=0;i<books.size();i++){
xml = new xmlbean();
book = (element)books.get(i ); //得到第一本书元素
xml.setbookname(book.getchild("书名").gettext());
xml.setauthor(book.getchild("作者").gettext());
xml.setpub(book.getchild("出版社").gettext());
xml.setprice(book.getchild("价格").gettext());
xml.setpubdate(book.getchild("出版日期").gettext());
xmlvector.add(xml);
}
}
catch(exception e){
system.err.println(e+"error");
}
finally{
try{
fi.close();
}
catch(exception e){
e.printstacktrace();
}
}
return xmlvector;
}
/**
* 删除xml文件指定信息
*/
public static void delxml(httpservletrequest request)throws exception{
fileinputstream fi = null;
fileoutputstream fo = null;
try{
string path=request.getparameter("path");
int xmlid=integer.parseint(request.getparameter("id"));
fi = new fileinputstream(path);
saxbuilder sb = new saxbuilder();
document doc = sb.build(fi);
element root = doc.getrootelement(); //得到根元素
list books = root.getchildren(); //得到根元素所有子元素的集合
books.remove(xmlid);//删除指定位置的子元素
string indent = " ";
boolean newlines = true;
xmloutputter outp = new xmloutputter(indent,newlines,"gbk");
fo=new fileoutputstream(path);
outp.output(doc,fo);
}
catch(exception e){
system.err.println(e+"error");
}
finally{
try{
fi.close();
fo.close();
}
catch(exception e){
e.printstacktrace();
}
}
}
/**
* 添加xml文件指定信息
*/
public static void addxml(httpservletrequest request)throws exception{
fileinputstream fi = null;
fileoutputstream fo = null;
try{
string path=request.getparameter("path");
fi = new fileinputstream(path);
saxbuilder sb = new saxbuilder();
document doc = sb.build(fi);
element root = doc.getrootelement(); //得到根元素
list books = root.getchildren(); //得到根元素所有子元素的集合
string bookname=request.getparameter("bookname");
string author=request.getparameter("author");
string price=request.getparameter("price");
string pub=request.getparameter("pub");
string pubdate=request.getparameter("pubdate");
text newtext;
element newbook= new element("书");
element newname= new element("书名");
newname.settext(bookname);
newbook.addcontent(newname);
element newauthor= new element("作者");
newauthor.settext(author);
newbook.addcontent(newauthor);
element newpub= new element("出版社");
newpub.settext(pub);
newbook.addcontent(newpub);
element newprice= new element("价格");
newprice.settext(price);
newbook.addcontent(newprice);
element newdate= new element("出版日期");
newdate.settext(pubdate);
newbook.addcontent(newdate);
books.add(newbook);//增加子元素
string indent = " ";
boolean newlines = true;
xmloutputter outp = new xmloutputter(indent,newlines,"gbk");
fo=new fileoutputstream(path);
outp.output(doc,fo);
}
catch(exception e){
system.err.println(e+"error");
}
finally{
try{
fi.close();
fo.close();
}
catch(exception e){
e.printstacktrace();
}
}
}
/**
* 修改xml文件指定信息
*/
public static void editxml(httpservletrequest request)throws exception{
fileinputstream fi = null;
fileoutputstream fo = null;
try{
string path=request.getparameter("path");
int xmlid=integer.parseint(request.getparameter("id"));
fi = new fileinputstream(path);
saxbuilder sb = new saxbuilder();
document doc = sb.build(fi);
element root = doc.getrootelement(); //得到根元素
list books = root.getchildren(); //得到根元素所有子元素的集合
element book=(element)books.get(xmlid);
string bookname=request.getparameter("bookname");
string author=request.getparameter("author");
string price=request.getparameter("price");
string pub=request.getparameter("pub");
string pubdate=request.getparameter("pubdate");
text newtext;
element newname= book.getchild("书名");
newname.settext(bookname);//修改书名为新的书名
element newauthor= book.getchild("作者");
newauthor.settext(author);
element newpub= book.getchild("出版社");
newpub.settext(pub);
element newprice= book.getchild("价格");
newprice.settext(price);
element newdate= book.getchild("出版日期");
newdate.settext(pubdate);
//books.set(xmlid,book);//修改子元素
string indent = " ";
boolean newlines = true;
xmloutputter outp = new xmloutputter(indent,newlines,"gbk");
fo=new fileoutputstream(path);
outp.output(doc,fo);
}
catch(exception e){
system.err.println(e+"error");
}
finally{
try{
fi.close();
fo.close();
}
catch(exception e){
e.printstacktrace();
}
}
}
}

下面是操作的jsp文件:
<%@ page contenttype="text/html;charset=gbk" %>
<%@ page language="java" import="java.util.*,xml.*"%>
<html>
<head>
<title>读取xml文件资料</title>
</head>
<body>
<h3 align="center">jdom操作xml文件</h3>
<p align="center">读取xml文件中的所有资料</p>
<center>
<table border="1" cellpadding="0" cellspacing="1" style="border-collapse: collapse" width="80%" id="autonumber1">
<tr>
<td align="center" width="92">书名</td>
<td align="center" width="92">作者</td>
<td align="center" width="92">出版社</td>
<td align="center" width="92">价格</td>
<td align="center" width="92">出版日期</td>
<td align="center" width="94">操作</td>
</tr>
</table>
<%
string path = application.getrealpath("/test/xml/")+"testc.xml";
xmlbean xml=new xmlbean();
vector xmlall=xml.loadxml(path);
for(int i=0;i<xmlall.size();i++){
xml=(xmlbean)xmlall.elementat(i );
/**out.println("书名:"+xml.getbookname()+"<br>");
out.println("作者:"+xml.getauthor()+"<br>");
out.println("出版社:"+xml.getpub()+"<br>");
out.println("价格:"+xml.getprice()+"<br>");
out.println("出版日期:"+xml.getpubdate()+"<br><br>");
*/
%>
<table border="1" cellpadding="0" cellspacing="1" style="border-collapse: collapse" width="80%" id="autonumber2">
<tr>
<td align="center" width="92"><%=xml.getbookname()%></td>
<td align="center" width="92"><%=xml.getauthor()%></td>
<td align="center" width="92"><%=xml.getpub()%></td>
<td align="center" width="92"><%=xml.getprice()%></td>
<td align="center" width="92"><%=xml.getpubdate()%></td>
<td align="center" width="94"><a href="xmlok.jsp?act=del&id=<%=i%>&path=<%=path%>">删除</a></td>
</tr>
</table>
<%}%>
</center>
<form method="post" action="xmlok.jsp">
<p align="center">
<input type="radio" value="add" checked name="act">添加资料 <input type="radio" value="edit" name="act">编辑资料
序 号:<select size="1" name="id">
<%for(int i=0;i<xmlall.size();i++){%>
<option value="<%=i%>">第<%=i+1%>条</option>
<%}%>
</select><br>
书 名:<input type="text" name="bookname" size="20"><br>
作 者:<input type="text" name="author" size="20"><br>
出版社:<input type="text" name="pub" size="20"><br>
价 格:<input type="text" name="price" size="20"><br>
日 期:<input type="text" name="pubdate" size="20"></p>
<input type="hidden" name="path" value="<%=path%>">
<p align="center"><input type="submit" value="提交" name="b1"><input type="reset" value="重置" name="b2"></p>
</form>
</body>
</html>

下面是处理上一文件提交的jsp文件:
<%@ page contenttype="text/html;charset=gbk" %>
<%@ page language="java" import="xml.*"%>
<%if(request.getparameter("act")!=null && request.getparameter("act").equals("add")){
xmlbean.addxml(request);
out.println("<p align='center'><br><br>添加成功<br><br><a href=''>返回</a>");
}
else if(request.getparameter("act")!=null && request.getparameter("act").equals("del")){
xmlbean.delxml(request);
out.println("<p align='center'><br><br>删除成功<br><br><a href=''>返回</a>");
}
else if(request.getparameter("act")!=null && request.getparameter("act").equals("edit")){
xmlbean.editxml(request);
out.println("<p align='center'><br><br>修改成功<br><br><a href=''>返回</a>");
}
else{out.print("<p align='center'><br><br>非法操作<br><br><a href=''>返回</a>");}

扫描关注微信公众号