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 1.0的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檔案: MyXml.xml
<?xml version="1.0" encoding="utf-8"?><書庫> <書> <書名>Java編程入門</書名> <作者>張三</作者> <出版社>電子出版社</出版社> <價格>35.0</價格> <出版日期>2002-10-07</出版日期> </書> <書> <書名>XML在Java中的應用</書名> <作者>李四</作者> <出版社>希望出版社</出版社> <價格>92.0</價格> <出版日期>2002-10-07</出版日期> </書></書庫>
下面是操作的jsp檔案: test.jsp
<%@ page contentType="text/html;charset=GBK"%><%@ page language="java" import="java.util.*,jdom.test.*"%><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("/JDOM/MyXml.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="xmlaction.jsp?act=del&id=<%=i%>&path=<%=path%>">刪除</a></td> </tr></table><%}%></center><form method="POST" action="xmlaction.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檔案: xmlation.jsp
<%@ page contentType="text/html;charset=GBK"%><%@ page language="java" import="jdom.test.*"%><%if (request.getParameter("act") != null && request.getParameter("act").equals("add")) { XmlBean.AddXML(request); out.println("<p align=center><br><br>添加成功<br><br><a href=test.jsp>返回</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=test.jsp>返回</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=test.jsp>返回</a>"); } else { out.print("<p align=center><br><br>非法操作<br><br><a href=test.jsp>返回</a>"); }%>
下面是操作XML檔案的Bean: XmlBean.java
jsppackage jdom.test;/** * 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 { request.setCharacterEncoding("GBK"); 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"); Format format = Format.getPrettyFormat(); format.setIndent(" "); format.setEncoding("utf-8"); XMLOutputter outp = new XMLOutputter(format); 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 { request.setCharacterEncoding("GBK"); 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"); Format format = Format.getPrettyFormat(); format.setIndent(" "); format.setEncoding("utf-8"); XMLOutputter outp = new XMLOutputter(format); 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 { request.setCharacterEncoding("GBK"); 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"); Format format = Format.getPrettyFormat(); format.setIndent(" "); format.setEncoding("utf-8"); XMLOutputter outp = new XMLOutputter(format); 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(); } } }}