1. 程式人生 > >SAX解析與DOM解析的區別

SAX解析與DOM解析的區別

1.SAX解析(Simple API for XML)

SAX解析方式:逐行掃描文件,一遍掃描一遍解析。相比於DOM,SAX可以在解析文件的任意時刻停止解析解析,是一種速度更快,更高效的方法。

優點:解析可以立即開始,速度快,沒有記憶體壓力

缺點:不能對結點做修改

適用:讀取XML檔案

  1. package cn.tedu;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4. import org.dom4j.Document;

  5. import org.dom4j.DocumentException;

  6. import org.dom4j.Element;

  7. import org.dom4j.io.SAXReader;

  8. import cn.tedu.entity.Emp;

  9. /**

  10. * 解析XML文件

  11. *

  12. */

  13. public class XMLReader {

  14. public static void main(String[] args) {

  15. SAXReader reader = new SAXReader() ;

  16. try {

  17. Document doc = reader.read("emplist.xml") ;

  18. //獲取根元素

  19. Element root = doc.getRootElement() ;

  20. System.out.println(root.getName()) ;

  21. //獲取子元素

  22. List<Element> list = root.elements() ;

  23. //用於儲存僱員資訊

  24. List<Emp> emps = new ArrayList<Emp>() ;

  25. for (Element e : list) {

  26. //獲取屬性

  27. String id = e.attributeValue("id") ;

  28. String name = e.elementText("name") ;

  29. int age = Integer.parseInt(e.elementText("age")) ;

  30. String gender = e.elementText("gender") ;

  31. double salary = new Double(e.elementText("salary")) ;

  32. Emp emp = new Emp(id, name, age, gender, salary) ;

  33. emps.add(emp) ;

  34. }

  35. //遍歷emps

  36. for (Emp emp : emps) {

  37. System.out.println(emp) ;

  38. }

  39. } catch (DocumentException e) {

  40. e.printStackTrace() ;

  41. System.err.println("文件解析失敗");

  42. }

  43. }

  44. }

2.DOM解析(Document Object Model)

DOM解析方式:DOM解析器在解析XML文件時,會把文件中的所有元素,按照其出現的層次關係,解析成一個個Node物件(節點)

優點:把XML檔案在記憶體中構建屬性結構,可以遍歷和修改節點。

缺點:如果檔案比較大,記憶體有壓力,解析的時間會比較長。

適用:修改XML資料

3.DOM4J

DOM4J有更復雜的api,所以dom4j比jdom有更大的靈活性.DOM4J效能最好,連Sun的JAXM也在用DOM4J.目前許多開源專案中大量採用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來讀取XML配置檔案。如果不考慮可移植性,那就採用DOM4J.

優點:靈活性最高、易用性和功能強大、效能優異

缺點:複雜的api、移植性差

適用:自行選擇

  1. package cn.tedu;

  2. import java.io.FileNotFoundException;

  3. import java.io.FileOutputStream;

  4. import java.io.IOException;

  5. import java.io.UnsupportedEncodingException;

  6. import java.util.ArrayList;

  7. import java.util.List;

  8. import org.dom4j.Document;

  9. import org.dom4j.DocumentHelper;

  10. import org.dom4j.Element;

  11. import org.dom4j.io.OutputFormat;

  12. import org.dom4j.io.XMLWriter;

  13. import cn.tedu.entity.Emp;

  14. /**

  15. * 建立XML文件

  16. *

  17. */

  18. public class CreateXml {

  19. public static void main(String[] args) {

  20. //1.建立一個空文件物件Document

  21. Document doc = DocumentHelper.createDocument() ;

  22. //2.像Document物件中新增根元素

  23. Element root =doc.addElement("emplist") ;

  24. //3.按照預定的格式依次向根元素中新增子元素來完成文件結構

  25. //建立僱員資訊

  26. List<Emp> list = new ArrayList<Emp>() ;

  27. Emp emp1 = new Emp("13" , "張三" , 14 , "男" , 9000.0) ;

  28. Emp emp2 = new Emp("14" , "李四" , 14 , "女" , 8000.0) ;

  29. list.add(emp1) ;

  30. list.add(emp2) ;

  31. //新增子元素

  32. for (Emp e : list) {

  33. Element emp = root.addElement("emp") ;

  34. emp.addAttribute("id" , e.getId()) ;

  35. emp.addElement("name").addText(e.getName()) ;

  36. emp.addElement("age").addText(e.getAge()+"") ;

  37. emp.addElement("gender").addText(e.getGender()) ;

  38. emp.addElement("salary").addText(e.getSalary()+"") ;

  39. }

  40. //4.建立XMLWriter

  41. XMLWriter writer = null ;

  42. try {

  43. writer = new XMLWriter(OutputFormat.createPrettyPrint()) ;

  44. writer.setOutputStream(new FileOutputStream("myemp.xml")) ;

  45. //5.將Document通過XMLWriter寫成XML文件

  46. writer.write(doc) ;

  47. System.out.println("生成完畢!");

  48. } catch (UnsupportedEncodingException e1) {

  49. e1.printStackTrace();

  50. } catch (FileNotFoundException e1) {

  51. e1.printStackTrace();

  52. } catch (IOException e1) {

  53. e1.printStackTrace();

  54. } finally {

  55. if(writer != null) {

  56. try {

  57. writer.close() ;

  58. } catch (IOException e1) {

  59. e1.printStackTrace();

  60. }

  61. }

  62. }

  63. }

  64. }

4.JDOM

JDOM是處理xml的純java api.使用具體類而不是介面.JDOM具有樹的遍歷,又有SAX的java規則.JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用介面。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。

JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文件(儘管它還可以將以前構造的DOM表示作為輸入)。它包含一些轉換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文字文件。JDOM是在Apache許可證變體下發布的開放原始碼。

優點:1、是基於樹的處理xml的java api,把樹載入到記憶體中.

        2、沒有向下相容的限制,所以比DOM簡單.

        3、速度快.

        4、具有SAX的java 規則.

缺點:1、不能處理大於記憶體的文件.

        2、JDOM表示XML文件邏輯模型,不能保證每個位元組真正變換.

        3、 針對例項文件不提供DTD與模式的任何實際模型.

        4、 不支援於DOM中相應遍歷包.

適用:自行選擇

--------------------- 作者:Hero_Ant 來源:CSDN 原文:https://blog.csdn.net/sinat_27170093/article/details/54173090?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!