用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文件:
<!--l version="1.0" encoding="GBK--><br />
<书库><br />
<书><br />
<书名>Java编程入门<br />
<作者>张三<br />
<出版社>电子出版社<br />
<价格>35.0<br />
<出版日期>2002-10-07<br />
<br />
<书><br />
<书名>XML在Java中的应用<br />
<作者>李四<br />
<出版社>希望出版社<br />
<价格>92.0<br />
<出版日期>2002-10-07<br />
<br />
<br />
<br />
下面是操作XML文件的Bean:<br />
package xml;<br />
/**<br />
* XML的读写操作Bean<br />
*/<br />
import java.io.*;<br />
import java.util.*;<br />
import org.jdom.*;<br />
import org.jdom.output.*;<br />
import org.jdom.input.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
public class XmlBean{<br />
private String bookname,author,pub,price,pubdate;<br />
public String getbookname() { return bookname;}<br />
public String getauthor() { return author;}<br />
public String getpub() { return pub;}<br />
public String getprice() { return price;}<br />
public String getpubdate() { return pubdate;}<br />
public void setbookname(String bookname) { this.bookname =bookname ; }<br />
public void setauthor(String author) { this.author =author; }<br />
public void setpub(String pub) { this.pub =pub ; }<br />
public void setprice(String price) { this.price =price ; }<br />
public void setpubdate(String pubdate) { this.pubdate =pubdate ; }<br />
public XmlBean(){}<br />
/**<br />
* 读取XML文件所有信息<br />
*/<br />
public Vector LoadXML(String path)throws Exception{<br />
Vector xmlVector = null;<br />
FileInputStream fi = null;<br />
try{<br />
fi = new FileInputStream(path);<br />
xmlVector = new Vector();<br />
SAXBuilder sb = new SAXBuilder();<br />
Document doc = sb.build(fi);<br />
Element root = doc.getRootElement(); //得到根元素<br />
List books = root.getChildren(); //得到根元素所有子元素的集合<br />
Element book =null;<br />
XmlBean xml =null;<br />
for(int i=0;i xml = new XmlBean();<br />
book = (Element)books.get(i ); //得到第一本书元素<br />
xml.setbookname(book.getChild("书名").getText());<br />
xml.setauthor(book.getChild("作者").getText());<br />
xml.setpub(book.getChild("出版社").getText());<br />
xml.setprice(book.getChild("价格").getText());<br />
xml.setpubdate(book.getChild("出版日期").getText());<br />
xmlVector.add(xml);<br />
}<br />
}<br />
catch(Exception e){<br />
System.err.println(e+"error");<br />
}<br />
finally{<br />
try{<br />
fi.close();<br />
}<br />
catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
}<br />
return xmlVector;<br />
}<br />
/**<br />
* 删除XML文件指定信息<br />
*/<br />
public static void DelXML(HttpServletRequest request)throws Exception{<br />
FileInputStream fi = null;<br />
FileOutputStream fo = null;<br />
try{<br />
String path=request.getParameter("path");<br />
int xmlid=Integer.parseInt(request.getParameter("id"));<br />
fi = new FileInputStream(path);<br />
SAXBuilder sb = new SAXBuilder();<br />
Document doc = sb.build(fi);<br />
Element root = doc.getRootElement(); //得到根元素<br />
List books = root.getChildren(); //得到根元素所有子元素的集合<br />
books.remove(xmlid);//删除指定位置的子元素<br />
String indent = " ";<br />
boolean newLines = true;<br />
XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");<br />
fo=new FileOutputStream(path);<br />
outp.output(doc,fo);<br />
}<br />
catch(Exception e){<br />
System.err.println(e+"error");<br />
}<br />
finally{<br />
try{<br />
fi.close();<br />
fo.close();<br />
}<br />
catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
/**<br />
* 添加XML文件指定信息<br />
*/<br />
public static void AddXML(HttpServletRequest request)throws Exception{<br />
FileInputStream fi = null;<br />
FileOutputStream fo = null;<br />
try{<br />
String path=request.getParameter("path");<br />
fi = new FileInputStream(path);<br />
SAXBuilder sb = new SAXBuilder();<br />
Document doc = sb.build(fi);<br />
Element root = doc.getRootElement(); //得到根元素<br />
List books = root.getChildren(); //得到根元素所有子元素的集合<br />
String bookname=request.getParameter("bookname");<br />
String author=request.getParameter("author");<br />
String price=request.getParameter("price");<br />
String pub=request.getParameter("pub");<br />
String pubdate=request.getParameter("pubdate");<br />
Text newtext;<br />
Element newbook= new Element("书");<br />
Element newname= new Element("书名");<br />
newname.setText(bookname);<br />
newbook.addContent(newname);<br />
Element newauthor= new Element("作者");<br />
newauthor.setText(author);<br />
newbook.addContent(newauthor);<br />
Element newpub= new Element("出版社");<br />
newpub.setText(pub);<br />
newbook.addContent(newpub);<br />
Element newprice= new Element("价格");<br />
newprice.setText(price);<br />
newbook.addContent(newprice);<br />
Element newdate= new Element("出版日期");<br />
newdate.setText(pubdate);<br />
newbook.addContent(newdate);<br />
books.add(newbook);//增加子元素<br />
String indent = " ";<br />
boolean newLines = true;<br />
XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");<br />
fo=new FileOutputStream(path);<br />
outp.output(doc,fo);<br />
}<br />
catch(Exception e){<br />
System.err.println(e+"error");<br />
}<br />
finally{<br />
try{<br />
fi.close();<br />
fo.close();<br />
}<br />
catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
/**<br />
* 修改XML文件指定信息<br />
*/<br />
public static void EditXML(HttpServletRequest request)throws Exception{<br />
FileInputStream fi = null;<br />
FileOutputStream fo = null;<br />
try{<br />
String path=request.getParameter("path");<br />
int xmlid=Integer.parseInt(request.getParameter("id"));<br />
fi = new FileInputStream(path);<br />
SAXBuilder sb = new SAXBuilder();<br />
Document doc = sb.build(fi);<br />
Element root = doc.getRootElement(); //得到根元素<br />
List books = root.getChildren(); //得到根元素所有子元素的集合<br />
Element book=(Element)books.get(xmlid);<br />
String bookname=request.getParameter("bookname");<br />
String author=request.getParameter("author");<br />
String price=request.getParameter("price");<br />
String pub=request.getParameter("pub");<br />
String pubdate=request.getParameter("pubdate");<br />
Text newtext;<br />
Element newname= book.getChild("书名");<br />
newname.setText(bookname);//修改书名为新的书名<br />
Element newauthor= book.getChild("作者");<br />
newauthor.setText(author);<br />
Element newpub= book.getChild("出版社");<br />
newpub.setText(pub);<br />
Element newprice= book.getChild("价格");<br />
newprice.setText(price);<br />
Element newdate= book.getChild("出版日期");<br />
newdate.setText(pubdate);<br />
//books.set(xmlid,book);//修改子元素<br />
String indent = " ";<br />
boolean newLines = true;<br />
XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");<br />
fo=new FileOutputStream(path);<br />
outp.output(doc,fo);<br />
}<br />
catch(Exception e){<br />
System.err.println(e+"error");<br />
}<br />
finally{<br />
try{<br />
fi.close();<br />
fo.close();<br />
}<br />
catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
}<br />
<br />
下面是操作的jsp文件:<br />
<!--page contentType="text/html;charset=GBK"-->
<!--page language="java" import="java.util.*,xml.*--></p>
<h3 align="center">JDOM操作XML文件
读取XML文件中的所有资料
| 书名 | 作者 | 出版社 | 价格 | 出版日期 | 操作 |
<!--r /> 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++){<br > </xmlall> xml=(XmlBean)xmlall.elementAt(i );
/**out.println("书名:"+xml.getbookname()+"
");
out.println("作者:"+xml.getauthor()+"
");
out.println("出版社:"+xml.getpub()+"
");
out.println("价格:"+xml.getprice()+"
");
out.println("出版日期:"+xml.getpubdate()+"
");
*/
-->
| <!--ml.getbookname(--> | <!--ml.getauthor(--> | <!--ml.getpub(--> | <!--ml.getprice(--> | <!--ml.getpubdate(--> | &path=<!--at-->">删除 |
<form action="xmlok.jsp" method="post">
<input type="radio" checked="checked" name="act" value="add" />添加资料 <input type="radio" name="act" value="edit" />编辑资料
序 号:
书 名:<input name="bookname" type="text" /><br />
作 者:<input name="author" type="text" /><br />
出版社:<input name="pub" type="text" /><br />
价 格:<input name="price" type="text" /><br />
日 期:<input name="pubdate" type="text" /></p>
<input type="hidden" name="path" value="<%=path%>" />
<input type="submit" name="B1" value="提交" /><input type="reset" name="B2" value="重置" />
</form>
下面是处理上一文件提交的jsp文件:
<!--page language="java" import="xml.*--> <p><br /> <%if(request.getParameter("act")!=null && request.getParameter("act").equals("add")){<br /> XmlBean.AddXML(request);<br /> out.println("</p> <p align="center">
添加成功
返回");
}
else if(request.getParameter("act")!=null && request.getParameter("act").equals("del")){
XmlBean.DelXML(request);
out.println("
删除成功
返回");
}
else if(request.getParameter("act")!=null && request.getParameter("act").equals("edit")){
XmlBean.EditXML(request);
out.println("
修改成功
返回");
}
else{out.print("
非法操作
返回");}

文章评论(查看全部)