JDOM

2009 - 09 - 01

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代码 复制代码
  1. <?xml version="1.0" encoding="GBK"?>  
  2. <书库>  
  3. <>  
  4. <书名>Java编程入门</书名>  
  5. <作者>张三</作者>  
  6. <出版社>电子出版社</出版社>  
  7. <价格>35.0</价格>  
  8. <出版日期>2002-10-07</出版日期>  
  9. </>  
  10. <>  
  11. <书名>XMLJava中的应用</书名>  
  12. <作者>李四</作者>  
  13. <出版社>希望出版社</出版社>  
  14. <价格>92.0</价格>  
  15. <出版日期>2002-10-07</出版日期>  
  16. </>  
  17. </书库>  

 

Java代码 复制代码
  1. <?xml version="1.0" encoding="GBK"?>   
  2. <书库>   
  3. <书>   
  4. <书名>Java编程入门</书名>   
  5. <作者>张三</作者>   
  6. <出版社>电子出版社</出版社>   
  7. <价格>35.0</价格>   
  8. <出版日期>2002-10-07</出版日期>   
  9. </书>   
  10. <书>   
  11. <书名>XMLJava中的应用</书名>   
  12. <作者>李四</作者>   
  13. <出版社>希望出版社</出版社>   
  14. <价格>92.0</价格>   
  15. <出版日期>2002-10-07</出版日期>   
  16. </书>   
  17. </书库>  
<?xml version="1.0" encoding="GBK"?>
<书库>
<书>
<书名>Java编程入门</书名>
<作者>张三</作者>
<出版社>电子出版社</出版社>
<价格>35.0</价格>
<出版日期>2002-10-07</出版日期>
</书>
<书>
<书名>XMLJava中的应用</书名>
<作者>李四</作者>
<出版社>希望出版社</出版社>
<价格>92.0</价格>
<出版日期>2002-10-07</出版日期>
</书>
</书库>


下面是操作XML文件的Bean:

Java代码 复制代码
  1. package xml;   
  2. /**  
  3. XML的读写操作Bean  
  4. */  
  5. import java.io.*;   
  6. import java.util.*;   
  7. import org.jdom.*;   
  8. import org.jdom.output.*;   
  9. import org.jdom.input.*;   
  10. import javax.servlet.*;   
  11. import javax.servlet.http.*;   
  12. public class XmlBean{   
  13. private String bookname,author,pub,price,pubdate;   
  14. public String getbookname() { return bookname;}   
  15. public String getauthor() { return author;}   
  16. public String getpub() { return pub;}   
  17. public String getprice() { return price;}   
  18. public String getpubdate() { return pubdate;}   
  19. public void setbookname(String bookname) { this.bookname =bookname ; }   
  20. public void setauthor(String author) { this.author =author; }   
  21. public void setpub(String pub) { this.pub =pub ; }   
  22. public void setprice(String price) { this.price =price ; }   
  23. public void setpubdate(String pubdate) { this.pubdate =pubdate ; }   
  24. public XmlBean(){}   
  25. /**  
  26. * 读取XML文件所有信息  
  27. */  
  28. public Vector LoadXML(String path)throws Exception{   
  29. Vector xmlVector = null;   
  30. FileInputStream fi = null;   
  31. try{   
  32. fi = new FileInputStream(path);   
  33. xmlVector = new Vector();   
  34. SAXBuilder sb = new SAXBuilder();   
  35. Document doc = sb.build(fi);   
  36. Element root = doc.getRootElement(); //得到根元素   
  37. List books = root.getChildren(); //得到根元素所有子元素的集合   
  38. Element book =null;   
  39. XmlBean xml =null;   
  40. for(int i=0;i<books.size();i++){   
  41. xml = new XmlBean();   
  42. book = (Element)books.get(i ); //得到第一本书元素   
  43. xml.setbookname(book.getChild("书名").getText());   
  44. xml.setauthor(book.getChild("作者").getText());   
  45. xml.setpub(book.getChild("出版社").getText());   
  46. xml.setprice(book.getChild("价格").getText());   
  47. xml.setpubdate(book.getChild("出版日期").getText());   
  48. xmlVector.add(xml);   
  49. }   
  50. }   
  51. catch(Exception e){   
  52. System.err.println(e+"error");   
  53. }   
  54. finally{   
  55. try{   
  56. fi.close();   
  57. }   
  58. catch(Exception e){   
  59. e.printStackTrace();   
  60. }   
  61. }   
  62. return xmlVector;   
  63. }   
  64. /**  
  65. * 删除XML文件指定信息  
  66. */  
  67. public static void DelXML(HttpServletRequest request)throws Exception{   
  68. FileInputStream fi = null;   
  69. FileOutputStream fo = null;   
  70. try{   
  71. String path=request.getParameter("path");   
  72. int xmlid=Integer.parseInt(request.getParameter("id"));   
  73. fi = new FileInputStream(path);   
  74. SAXBuilder sb = new SAXBuilder();   
  75. Document doc = sb.build(fi);   
  76. Element root = doc.getRootElement(); //得到根元素   
  77. List books = root.getChildren(); //得到根元素所有子元素的集合   
  78. books.remove(xmlid);//删除指定位置的子元素   
  79. String indent = " ";   
  80. boolean newLines = true;   
  81. XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");   
  82. fo=new FileOutputStream(path);   
  83. outp.output(doc,fo);   
  84. }   
  85. catch(Exception e){   
  86. System.err.println(e+"error");   
  87. }   
  88. finally{   
  89. try{   
  90. fi.close();   
  91. fo.close();   
  92. }   
  93. catch(Exception e){   
  94. e.printStackTrace();   
  95. }   
  96. }   
  97. }   
  98. /**  
  99. * 添加XML文件指定信息  
  100. */  
  101. public static void AddXML(HttpServletRequest request)throws Exception{   
  102. FileInputStream fi = null;   
  103. FileOutputStream fo = null;   
  104. try{   
  105. String path=request.getParameter("path");   
  106. fi = new FileInputStream(path);   
  107. SAXBuilder sb = new SAXBuilder();   
  108. Document doc = sb.build(fi);   
  109. Element root = doc.getRootElement(); //得到根元素   
  110. List books = root.getChildren(); //得到根元素所有子元素的集合   
  111. String bookname=request.getParameter("bookname");   
  112. String author=request.getParameter("author");   
  113. String price=request.getParameter("price");   
  114. String pub=request.getParameter("pub");   
  115. String pubdate=request.getParameter("pubdate");   
  116. Text newtext;   
  117. Element newbook= new Element("书");   
  118. Element newname= new Element("书名");   
  119. newname.setText(bookname);   
  120. newbook.addContent(newname);   
  121. Element newauthor= new Element("作者");   
  122. newauthor.setText(author);   
  123. newbook.addContent(newauthor);   
  124. Element newpub= new Element("出版社");   
  125. newpub.setText(pub);   
  126. newbook.addContent(newpub);   
  127. Element newprice= new Element("价格");   
  128. newprice.setText(price);   
  129. newbook.addContent(newprice);   
  130. Element newdate= new Element("出版日期");   
  131. newdate.setText(pubdate);   
  132. newbook.addContent(newdate);   
  133. books.add(newbook);//增加子元素   
  134. String indent = " ";   
  135. boolean newLines = true;   
  136. XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");   
  137. fo=new FileOutputStream(path);   
  138. outp.output(doc,fo);   
  139. }   
  140. catch(Exception e){   
  141. System.err.println(e+"error");   
  142. }   
  143. finally{   
  144. try{   
  145. fi.close();   
  146. fo.close();   
  147. }   
  148. catch(Exception e){   
  149. e.printStackTrace();   
  150. }   
  151. }   
  152. }   
  153. /**  
  154. * 修改XML文件指定信息  
  155. */  
  156. public static void EditXML(HttpServletRequest request)throws Exception{   
  157. FileInputStream fi = null;   
  158. FileOutputStream fo = null;   
  159. try{   
  160. String path=request.getParameter("path");   
  161. int xmlid=Integer.parseInt(request.getParameter("id"));   
  162. fi = new FileInputStream(path);   
  163. SAXBuilder sb = new SAXBuilder();   
  164. Document doc = sb.build(fi);   
  165. Element root = doc.getRootElement(); //得到根元素   
  166. List books = root.getChildren(); //得到根元素所有子元素的集合   
  167. Element book=(Element)books.get(xmlid);   
  168. String bookname=request.getParameter("bookname");   
  169. String author=request.getParameter("author");   
  170. String price=request.getParameter("price");   
  171. String pub=request.getParameter("pub");   
  172. String pubdate=request.getParameter("pubdate");   
  173. Text newtext;   
  174. Element newname= book.getChild("书名");   
  175. newname.setText(bookname);//修改书名为新的书名   
  176. Element newauthor= book.getChild("作者");   
  177. newauthor.setText(author);   
  178. Element newpub= book.getChild("出版社");   
  179. newpub.setText(pub);   
  180. Element newprice= book.getChild("价格");   
  181. newprice.setText(price);   
  182. Element newdate= book.getChild("出版日期");   
  183. newdate.setText(pubdate);   
  184. //books.set(xmlid,book);//修改子元素   
  185. String indent = " ";   
  186. boolean newLines = true;   
  187. XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");   
  188. fo=new FileOutputStream(path);   
  189. outp.output(doc,fo);   
  190. }   
  191. catch(Exception e){   
  192. System.err.println(e+"error");   
  193. }   
  194. finally{   
  195. try{   
  196. fi.close();   
  197. fo.close();   
  198. }   
  199. catch(Exception e){   
  200. e.printStackTrace();   
  201. }   
  202. }   
  203. }   
  204. }   
  205.   
  206. 下面是操作的jsp文件:   
  207. <%@ page contentType="text/html;charset=GBK" %>   
  208. <%@ page language="java" import="java.util.*,xml.*"%>   
  209. <html>   
  210. <head>   
  211. <title>读取XML文件资料</title>   
  212. </head>   
  213. <body>   
  214. <h3 align="center">JDOM操作XML文件</h3>   
  215. <p align="center">读取XML文件中的所有资料</p>   
  216. <center>   
  217. <table border="1" cellpadding="0" cellspacing="1" style="border-collapse: collapse" width="80%" id="AutoNumber1">   
  218. <tr>   
  219. <td align="center" width="92">书名</td>   
  220. <td align="center" width="92">作者</td>   
  221. <td align="center" width="92">出版社</td>   
  222. <td align="center" width="92">价格</td>   
  223. <td align="center" width="92">出版日期</td>   
  224. <td align="center" width="94">操作</td>   
  225. </tr>   
  226. </table>   
  227. <%   
  228. String path = application.getRealPath("/test/xml/")+"testC.xml";   
  229. XmlBean xml=new XmlBean();   
  230. Vector xmlall=xml.LoadXML(path);   
  231. for(int i=0;i<xmlall.size();i++){   
  232. xml=(XmlBean)xmlall.elementAt(i );   
  233. /**out.println("书名:"+xml.getbookname()+"<br>");  
  234. out.println("作者:"+xml.getauthor()+"<br>");  
  235. out.println("出版社:"+xml.getpub()+"<br>");  
  236. out.println("价格:"+xml.getprice()+"<br>");  
  237. out.println("出版日期:"+xml.getpubdate()+"<br><br>");  
  238. */  
  239. %>   
  240. <table border="1" cellpadding="0" cellspacing="1" style="border-collapse: collapse" width="80%" id="AutoNumber2">   
  241. <tr>   
  242. <td align="center" width="92"><%=xml.getbookname()%></td>   
  243. <td align="center" width="92"><%=xml.getauthor()%></td>   
  244. <td align="center" width="92"><%=xml.getpub()%></td>   
  245. <td align="center" width="92"><%=xml.getprice()%></td>   
  246. <td align="center" width="92"><%=xml.getpubdate()%></td>   
  247. <td align="center" width="94"><a href="xmlok.jsp?act=del&id=<%=i%>&path=<%=path%>">删除</a></td>   
  248. </tr>   
  249. </table>   
  250. <%}%>   
  251. </center>   
  252. <form method="POST" action="xmlok.jsp">   
  253. <p align="center">   
  254. <input type="radio" value="add" checked name="act">添加资料 <input type="radio" value="edit" name="act">编辑资料   
  255. 序 号:<select size="1" name="id">   
  256. <%for(int i=0;i<xmlall.size();i++){%>   
  257. <option value="<%=i%>">第<%=i+1%>条</option>   
  258. <%}%>   
  259. </select><br>   
  260. 书 名:<input type="text" name="bookname" size="20"><br>   
  261. 作 者:<input type="text" name="author" size="20"><br>   
  262. 出版社:<input type="text" name="pub" size="20"><br>   
  263. 价 格:<input type="text" name="price" size="20"><br>   
  264. 日 期:<input type="text" name="pubdate" size="20"></p>   
  265. <input type="hidden" name="path" value="<%=path%>">   
  266. <p align="center"><input type="submit" value="提交" name="B1"><input type="reset" value="重置" name="B2"></p>   
  267. </form>   
  268. </body>   
  269. </html>   
  270.   
  271. 下面是处理上一文件提交的jsp文件:   
  272. <%@ page contentType="text/html;charset=GBK" %>   
  273. <%@ page language="java" import="xml.*"%>   
  274. <%if(request.getParameter("act")!=null && request.getParameter("act").equals("add")){   
  275. XmlBean.AddXML(request);   
  276. out.println("<p align='center'><br><br>添加成功<br><br><a href=''>返回</a>");   
  277. }   
  278. else if(request.getParameter("act")!=null && request.getParameter("act").equals("del")){   
  279. XmlBean.DelXML(request);   
  280. out.println("<p align='center'><br><br>删除成功<br><br><a href=''>返回</a>");   
  281. }   
  282. else if(request.getParameter("act")!=null && request.getParameter("act").equals("edit")){   
  283. XmlBean.EditXML(request);   
  284. out.println("<p align='center'><br><br>修改成功<br><br><a href=''>返回</a>");   
  285. }   
  286. else{out.print("<p align='center'><br><br>非法操作<br><br><a href=''>返回</a>");}    
  287.    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值