天山茗客的小屋

          JavaEE|Struts|Spring|Hibernate|Groovy on Grails|NetBeans
          數據加載中……

          第一篇博客——XML學習之旅一XML解析器

                  自大二開始學習java已有一年多了,空閑時經常會去一些java方面的網站或論壇逛逛,里面的內容著實讓我這個初入java的小菜鳥大開眼界。逛網站和論壇讓我收獲頗多,不到一年多的時間感覺我的java水品有了明顯地提高。尤其是那些辛勤勞動的博主們,是你們的無私奉獻,知識共享的精神才讓我們這些初學者獲得了極佳的學習途徑和解決困境的方法。在此向你們表示最崇高的敬意和最真摯的感謝。

                  學習了這么久的java,也一直想寫一點東西,分享一下自己的學習經歷。因為一直沒有想到好寫的主題,所以遲遲沒有動筆。直到前幾天,開始著手做一個考試系統項目時,因為需要用到xml解析器(將試題從一個xml的試題文件中解析出來),在這幾天對幾種常用的xml解析器進行了一次完整地學習。blogjava是一個很好的java博客網站,也是一個很好的學習交流平臺,經??梢栽谏厦婵吹胶芏鄡炐愕奈恼拢缇图尤隻logjava的沖動。今天終于在blogjava上注冊一個自己的博客,從今天開始我的第一篇博客吧,我把我這幾天學習xml解析器做了一個總結,作為我的第一篇博客——XML學習之旅一幾種常用XML解析器的比較,與大家分享一下吧。 
                 

                  XML在java中的使用越來越廣泛,掌握幾種常用的XML解析器十分有必要。目前XML主要的解器有DOM,SAX和JDOM.
                  DOM是一套為合法的Well-Formed文件設計的API應用程序接口,它同時定義了這些文件的邏輯結構,訪問和操作方法.由W3C制定,目標是提供一個可以通用于各種程序語言,操作系統和應用程序的API,所以DOM具有極高的兼容性.
                  SAX(Simple Application interface for XML)是一個為基于事件XML解析器定義的,可以免費獲得的,與平臺語言無關的API,它允許程序和腳本動態的訪問和更新文檔的內容,結構和風格.
                  JDOM是兩位著名的 Java 開發人員兼作者,Brett Mclaughlin 和 Jason Hunter 的創作成果,它是一個開源項目,它基于樹型結構,利用純Java的技術對XML文件實現解析,生成,序列化以及其他許多操作.JDOM直接為Java編程服務,它利用強有力的Java語言的諸多特性,把SAX和DOM的功能有效地結合起來,在使用設計上盡可能地隱藏原來使用過程中的復雜性.
                  
                  對于DOM和SAX在API中能直接找到,其中包含了三個軟件包:

                        ·org.w3c.dom ,W3C 推薦的用于 XML 標準規劃文檔對象模型的 Java 工具 
                        ·org.xml.sax ,用于對 XML 進行語法分析的事件驅動的簡單 API 
                        ·javax.xml.parsers ,工廠化工具,允許應用程序開發人員獲得并配置特殊的語法分析器工具 JDOM 能夠替換 
               
                   JDOM是一個開源項目,使用時需要導入jdom.jar到庫中。相對于直接使用API中的解析器,JDOM使用起來要更簡單得多。JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter開發出來,以彌補DOM及SAX在實際應用當中的不足之處。下面我們通過一個實際的例子,分別使用兩種方式實現解析xml的試題文件來比較兩者的不同。

                  本次需要解析的XML文件Item.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <list>
                    <item id="1">
                      <answer>C</answer>
                      <level>1</level>
                      <question>在下列存儲器中,訪問速度最快的是:_______
                              A) 硬盤存儲器
                             B) 軟盤存儲器
                             C) 半導體RAM(內存儲器)
                             D) 磁帶存儲器</question>
                      <questionType>基礎題</questionType>
                    </item>
                    <item id="2">
                      <answer>D</answer>
                      <level>1</level>
                      <question>下面是關于微型計算機操作的四條敘述,其中正確的一條是:_______
                         A)系統不會用輸入日期做任何事,可以隨便輸入過去一個日期作當天日期
                         B) 用戶每鍵入一個字符時,DOS就立即將其讀取并識別之
                         C) 啟動DOS系統時,如不想輸入新時間,用戶只按下任意鍵就行
                         D)軟盤可以在切斷電源之前取出來,也可以在切斷電源之后取出來</question>
                      <questionType>基礎題</questionType>
                    </item>
                  </list>

           同過使用DOM和SAX對Item.xml進行解析DomExample.java
           

           1package action;
           2
           3 /**
           4 *
           5 * @author weiqishaonian
           6 */

           7import java.io.FileInputStream;
           8import java.io.IOException;
           9import java.io.InputStream;
          10
          11import java.util.logging.Level;
          12import java.util.logging.Logger;
          13
          14import javax.xml.parsers.DocumentBuilder;
          15import javax.xml.parsers.DocumentBuilderFactory;
          16import javax.xml.parsers.ParserConfigurationException;
          17//下面主要是org.xml.sax包的類
          18import org.w3c.dom.Document;
          19import org.w3c.dom.Element;
          20import org.w3c.dom.Node;
          21import org.w3c.dom.NodeList;
          22import org.xml.sax.SAXException;
          23
          24public class DomExample {
          25
          26    private Document doc;
          27    private InputStream is = null;
          28
          29    public DomExample(String xmlFilePath) {
          30        try {
          31            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//(1)得到DOM解析器的工廠實例
          32            DocumentBuilder db = dbf.newDocumentBuilder();//(2)從DOM工廠獲得DOM解析器
          33            is = new FileInputStream(xmlFilePath);//(3)把要解析的XML文檔轉化為輸入流,以便DOM解析器解析它
          34            doc = db.parse(is);//(4)解析XML文檔的輸入流,得到一個Document
          35            Element emt = doc.getDocumentElement();//(5)得到XML文檔的根節點
          36            NodeList list = emt.getChildNodes();//(6)得到節點的子節點
          37            if (list != null{
          38                for (int i = 0; i < list.getLength(); i++{
          39                    Node item = list.item(i);
          40                    if (item.getNodeType() == Node.ELEMENT_NODE) {
          41                        //(7)取得節點的屬性值
          42                        String id = item.getAttributes().getNamedItem("id").getNodeValue();
          43                        System.out.println(id);
          44                        //(8)輪循子節點
          45                        for (Node node = item.getFirstChild(); node != null; node = node.getNextSibling()) {
          46                            if (node.getNodeType() == Node.ELEMENT_NODE) {
          47                                if (node.getNodeName().equals("answer")) {
          48                                    String answer = node.getFirstChild().getNodeValue();//得到試題答案
          49                                    System.out.println(answer);
          50                                }

          51                                if (node.getNodeName().equals("level")) {
          52                                    String level = node.getFirstChild().getNodeValue();//得到試題等級
          53                                    System.out.println(level);
          54                                }

          55                                if (node.getNodeName().equals("question")) {
          56                                    String question = node.getFirstChild().getNodeValue();//得到試題
          57                                    System.out.println(question);
          58                                }

          59                                if (node.getNodeName().equals("questionType")) {
          60                                    String questionType = node.getFirstChild().getNodeValue();//得到試題類型
          61                                    System.out.println(questionType);
          62                                }

          63                            }

          64                        }

          65                    }

          66                }

          67            }

          68            is.close();
          69        }
           catch (SAXException ex) {
          70            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
          71        }
           catch (IOException ex) {
          72            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
          73        }
           catch (ParserConfigurationException ex) {
          74            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
          75        }

          76    }

          77
          78    public static void main(String[] args) {
          79        System.out.println("===========================================");
          80        new DomExample("D:/item.xml");
          81        System.out.println("===========================================");
          82    }

          83
          84}

          85

          運行結果:
          run-single:
          ===========================================
          1
          C
          1
          在下列存儲器中,訪問速度最快的是:_______
             A) 硬盤存儲器
             B) 軟盤存儲器
             C) 半導體RAM(內存儲器)
             D) 磁帶存儲器
          基礎題
          2
          D
          1
          下面是關于微型計算機操作的四條敘述,其中正確的一條是:_______
             A)系統不會用輸入日期做任何事,可以隨便輸入過去一個日期作當天日期
             B) 用戶每鍵入一個字符時,DOS就立即將其讀取并識別之
             C) 啟動DOS系統時,如不想輸入新時間,用戶只按下任意鍵就行
             D)軟盤可以在切斷電源之前取出來,也可以在切斷電源之后取出來
          基礎題
          ===========================================
          BUILD SUCCESSFUL (total time: 0 seconds)

          同過使用JDOM對Item.xml進行解析JDomExample.java

           

           1package action;
           2
           3/**
           4 *
           5 * @author weiqishaonian
           6 */

           7import java.io.FileInputStream;
           8import java.io.IOException;
           9import java.util.List;
          10import java.util.logging.Level;
          11import java.util.logging.Logger;
          12
          13import org.jdom.Document;
          14import org.jdom.Element;
          15import org.jdom.JDOMException;
          16import org.jdom.input.SAXBuilder;
          17
          18public class JDomExample {
          19
          20    public JDomExample(String xmlFilePath) {
          21        try {
          22            SAXBuilder sb = new SAXBuilder();//
          23            Document doc = sb.build(new FileInputStream(xmlFilePath));
          24            Element root = doc.getRootElement(); //得到根元素
          25            List items = root.getChildren(); //得到根元素所有子元素的集合
          26            for (int i = 0; i < items.size(); i++{
          27                Element item = (Element) items.get(i); //得到第i個item元素
          28                System.out.println(item.getAttribute("id").toString());
          29                Element answer = item.getChild("answer"); //得到試題答案
          30                System.out.println(answer.getText());
          31                Element level = item.getChild("level"); //得到試題等級
          32                System.out.println(level.getText());
          33                Element question = item.getChild("question"); //得到試題
          34                System.out.println(question.getText());
          35                Element questionType = item.getChild("questionType"); //得到試題類型
          36                System.out.println(questionType.getText());
          37            }

          38        }
           catch (JDOMException ex) {
          39            Logger.getLogger(JDomExample.class.getName()).log(Level.SEVERE, null, ex);
          40        }
           catch (IOException ex) {
          41            Logger.getLogger(JDomExample.class.getName()).log(Level.SEVERE, null, ex);
          42        }

          43    }

          44
          45    public static void main(String[] args) {
          46        System.out.println("===========================================");
          47        new JDomExample("D:/item.xml");
          48        System.out.println("===========================================");
          49    }

          50}

          51
          52
          運行結果:
          run-single:
          ===========================================
          [Attribute: id="1"]
          C
          1
          在下列存儲器中,訪問速度最快的是:_______
             A) 硬盤存儲器
             B) 軟盤存儲器
             C) 半導體RAM(內存儲器)
             D) 磁帶存儲器
          基礎題
          [Attribute: id="2"]
          D
          1
          下面是關于微型計算機操作的四條敘述,其中正確的一條是:_______
             A)系統不會用輸入日期做任何事,可以隨便輸入過去一個日期作當天日期
             B) 用戶每鍵入一個字符時,DOS就立即將其讀取并識別之
             C) 啟動DOS系統時,如不想輸入新時間,用戶只按下任意鍵就行
             D)軟盤可以在切斷電源之前取出來,也可以在切斷電源之后取出來
          基礎題
          ===========================================
          BUILD SUCCESSFUL (total time: 0 seconds)

                  通過上面兩個文件比較,我們可以明顯的看出區別。JDOM解析要比使用DOM和SAX進行解析使用起來更簡單,完成同樣的功能用JDOM比使用DOM和SAX要少很多代碼(請看DomExample.java和JDomExample.java文件),而且使用JDOM的代碼看起來更為清晰。JDOM 直接為JAVA編程服務。它利用更為強有力的JAVA語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結合起來。 Jdom是用Java語言讀、寫、操作XML的新API函數。Jason Hunter 和 Brett McLaughlin公開發布了它的1.0版本。在直覺、簡單和高效的前提下,這些API函數被最大限度的優化。在接下來的篇幅里將介紹怎么用Jdom去讀寫一個已經存在的XML文檔。在使用設計上盡可能地隱藏原來使用XML過程中的復雜性。利用JDOM處理XML文檔將是一件輕松、簡單的事。      

          posted on 2008-05-02 01:41 天山茗客 閱讀(588) 評論(2)  編輯  收藏 所屬分類: XML

          評論

          # re: 第一篇博客——XML學習之旅一幾種常用XML解析器的比較  回復  更多評論   

          不錯,我是去年10月份才開始學習java,看來還是要好好學,今年和你一樣吧,都大三了。能交個朋友?
          QQ:42422150
          2008-05-02 13:12 | fraiky

          # re: 第一篇博客——XML學習之旅一幾種常用XML解析器的比較  回復  更多評論   

          @fraiky
          樂意成為朋友,讓我們在java學習之旅上一起努力吧!
          我的QQ:329755053
          2008-05-02 14:46 | 天山茗客

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 达州市| 昔阳县| 聂荣县| 平舆县| 蓬安县| 屏东县| 宁津县| 布拖县| 招远市| 湟源县| 敖汉旗| 张家口市| 封开县| 凯里市| 策勒县| 中卫市| 张家川| 镇雄县| 会同县| 芜湖市| 章丘市| 乡宁县| 康马县| 惠东县| 北辰区| 田林县| 石嘴山市| 昆明市| 阳高县| 六枝特区| 辽中县| 定陶县| 合水县| 彩票| 微山县| 阿坝县| 库车县| 麻阳| 民勤县| 化德县| 皮山县|