java与xml之JDOM生成和解析XML文档

JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。

    
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

    JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数 
Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。

    
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

为减少DOM、SAX的编码量,出现了JDOM;

优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

[java]  view plain  copy
  1. package com.mdy.xml.xmldemo;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.util.List;  
  8.   
  9. import org.jdom.Attribute;  
  10. import org.jdom.Document;  
  11. import org.jdom.Element;  
  12. import org.jdom.JDOMException;  
  13. import org.jdom.input.SAXBuilder;  
  14. import org.jdom.output.Format;  
  15. import org.jdom.output.XMLOutputter;  
  16.   
  17. public class JDomDemo{  
  18.       
  19.     public static void main(String[] args) {  
  20.         String fileName = "jdomDemo.xml";  
  21.         JDomDemo dom4jDemo = new JDomDemo();  
  22.         dom4jDemo.createXML(fileName);  
  23.         dom4jDemo.parserXML(fileName);  
  24.     }  
  25.   
  26.     public void createXML(String fileName) {  
  27.         Element root = new Element("books");  
  28.         Document document = new Document(root);  
  29.         // 循环创建三本书  
  30.         for(int i = 0;i<3;i++){  
  31.             Element book = new Element("book");  
  32.             book.setAttribute("id", (i+1)+"");  
  33.             Element bookName = new Element("name");  
  34.             bookName.setText("书本"+i);  
  35.             Element bookPrice = new Element("price");  
  36.             bookPrice.setText((i+1)*50+"");  
  37.             Element bookAuthor = new Element("author");  
  38.             bookAuthor.setText("作者"+i);  
  39.             Element seller = new Element("seller");  
  40.             Element sellerName = new Element("sellerName");  
  41.             Element sellerName2 = new Element("sellerName");  
  42.             sellerName.setText("张三");  
  43.             sellerName2.setText("李四");  
  44.             seller.addContent(sellerName);  
  45.             seller.addContent(sellerName2);  
  46.             book.addContent(bookName);  
  47.             book.addContent(bookPrice);  
  48.             book.addContent(bookAuthor);  
  49.             book.addContent(seller);  
  50.             root.addContent(book);  
  51.         }  
  52.          Format format = Format.getCompactFormat();   
  53.          format.setEncoding("UTF-8");   
  54.          format.setIndent("    ");   
  55.          XMLOutputter xmlOutputter = new XMLOutputter(format);  
  56.         // XMLOutputter xmlOutputter = new XMLOutputter();  
  57.         try {  
  58.             xmlOutputter.output(document, new FileOutputStream(fileName));  
  59.         } catch (FileNotFoundException e) {  
  60.             e.printStackTrace();  
  61.         } catch (IOException e) {  
  62.             e.printStackTrace();  
  63.         }  
  64.     }  
  65.   
  66.     public void parserXML(String fileName) {  
  67.         SAXBuilder builder = new SAXBuilder(false);  
  68.         try {  
  69.             Document document = builder.build(new FileInputStream(fileName));  
  70.             Element root = document.getRootElement();  
  71.             getNode(root);//采用循环遍历的方式,解析每个节点  
  72.         } catch (FileNotFoundException e) {  
  73.             e.printStackTrace();  
  74.         } catch (JDOMException e) {  
  75.             e.printStackTrace();  
  76.         } catch (IOException e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.   
  81.     public void getNode(Element node){  
  82.         if(node.isRootElement()){  
  83.             System.out.println("根节点:"+node.getName());  
  84.         }else{  
  85.             if(node.getText() != null && !"".equals(node.getText().trim())){  
  86.                 System.out.print("解析节点:"+node.getName());  
  87.                 System.out.println("--->"+node.getText());  
  88.             }else{  
  89.                 System.out.println("解析节点:"+node.getName());  
  90.             }  
  91.         }  
  92.         List attList = node.getAttributes();  
  93.         for(int j = 0;j<attList.size();j++){  
  94.             Attribute attribute = (Attribute) attList.get(j);  
  95.             System.out.println("   属性-->"+attribute.getName()+":"+attribute.getValue());  
  96.         }  
  97.         List list = node.getChildren();  
  98.         for(int i = 0;i<list.size();i++){  
  99.             getNode((Element) list.get(i));  
  100.         }  
  101.           
  102.     }  
  103. }  

运行结果

生成的jdomDemo.xml文件如下:


[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <books>  
  3.     <book id="1">  
  4.         <name>书本0</name>  
  5.         <price>50</price>  
  6.         <author>作者0</author>  
  7.         <seller>  
  8.             <sellerName>张三</sellerName>  
  9.             <sellerName>李四</sellerName>  
  10.         </seller>  
  11.     </book>  
  12.     <book id="2">  
  13.         <name>书本1</name>  
  14.         <price>100</price>  
  15.         <author>作者1</author>  
  16.         <seller>  
  17.             <sellerName>张三</sellerName>  
  18.             <sellerName>李四</sellerName>  
  19.         </seller>  
  20.     </book>  
  21.     <book id="3">  
  22.         <name>书本2</name>  
  23.         <price>150</price>  
  24.         <author>作者2</author>  
  25.         <seller>  
  26.             <sellerName>张三</sellerName>  
  27.             <sellerName>李四</sellerName>  
  28.         </seller>  
  29.     </book>  
  30. </books>  


解析生成的xml文档如下:

[plain]  view plain  copy
  1. 根节点:books  
  2. 解析节点:book  
  3.    属性-->id:1  
  4. 解析节点:name--->书本0  
  5. 解析节点:price--->50  
  6. 解析节点:author--->作者0  
  7. 解析节点:seller  
  8. 解析节点:sellerName--->张三  
  9. 解析节点:sellerName--->李四  
  10. 解析节点:book  
  11.    属性-->id:2  
  12. 解析节点:name--->书本1  
  13. 解析节点:price--->100  
  14. 解析节点:author--->作者1  
  15. 解析节点:seller  
  16. 解析节点:sellerName--->张三  
  17. 解析节点:sellerName--->李四  
  18. 解析节点:book  
  19.    属性-->id:3  
  20. 解析节点:name--->书本2  
  21. 解析节点:price--->150  
  22. 解析节点:author--->作者2  
  23. 解析节点:seller  
  24. 解析节点:sellerName--->张三  
  25. 解析节点:sellerName--->李四  


不过JDOM需要引入jar包:jdom.jar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值