花開有時

          花開有時,花落有時,來有時,去有時。不撕扯,只關切;不紀念,只牽掛;不感動,只明白;不尋找,只記得。
          隨筆 - 24, 文章 - 0, 評論 - 54, 引用 - 0
          數據加載中……

          成功!用SAX讀取XML文件。

          上次是用DOM讀取的XML文件,我接著書往下讀又發現了用SAX讀取文件的方法,當然是用Groovy寫的,我把它改為用java寫的了,代碼如下:

          package test;

          import java.io.FileInputStream;

          import java.io.FileNotFoundException;

          import java.io.IOException;

          import java.util.ArrayList;

          import java.util.List;

          import javax.xml.parsers.ParserConfigurationException;

          import javax.xml.parsers.SAXParserFactory;

          import org.xml.sax.Attributes;

          import org.xml.sax.InputSource;

          import org.xml.sax.SAXException;

          import org.xml.sax.XMLReader;

          import org.xml.sax.helpers.DefaultHandler;

          publicclass JSAX {

              publicstaticvoid main(String[] args) {

                  DefaultHandler handler = new PlanHandler();

                 try {

                     XMLReader reader = SAXParserFactory.newInstance().newSAXParser()

                             .getXMLReader();

                     reader.setContentHandler(handler);

                     FileInputStream inpustStream = new FileInputStream(

                             "./src/data/pla.xml");

                     reader.parse(new InputSource(inpustStream));

                     inpustStream.close();

                     System.out.println(((PlanHandler) handler).getUnderway());

                     System.out.println(((PlanHandler) handler).getUpcoming());

                 } catch (SAXException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

                 } catch (ParserConfigurationException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

                 } catch (FileNotFoundException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

                 } catch (IOException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

                 }

              }

          }

          class PlanHandler extends DefaultHandler {

              List underway = new ArrayList();

              List upcoming = new ArrayList();

              @Override

              publicvoid startElement(String uri, String localName, String name,

                     Attributes attributes) throws SAXException {

                 if (!name.equals("task"))

                     return;

                  String title = attributes.getValue("title");

                  String total = attributes.getValue("total");

                  String done = attributes.getValue("done");

                  switch (Integer.valueOf(done)) {

                 case 0:

                     upcoming.add(title);

                     break;

                  default:

                     if (!total.equals(done))

                         underway.add(title);

                 }

              }

              public List getUnderway() {

                  returnunderway;

              }

              public List getUpcoming() {

                  returnupcoming;

              }

          }

          輸出結果是:

          [use in current project]

          [re-read DB chapter, use DB/XML combination]

          從代碼上來看,SAXDOM復雜了一些,主要是要寫一個處理器類PlanHandler用來處理xml文件,而且Sax好像還不能在樹形數據結構中進行位置的操作。書上說SAXPush-Style型的(推型?),現在在java里處理xml文件的趨勢是用Pull-Style型的(拉型?),在這之中最普遍的分析器是叫StAX-based parsers,不過這個是在java6中有,我沒有java6的開發包,只能看看書上的代碼了。

          下面是書上用Groovy寫的代碼:

          import javax.xml.parsers.SAXParserFactory

          import org.xml.sax.*

          import org.xml.sax.helpers.DefaultHandler

          class PlanHandler extends DefaultHandler {

          def underway = []

          def upcoming = []

          void startElement(String namespace, String localName,

          String qName, Attributes atts) {

          if (qName != 'task') return

          def title = atts.getValue('title')

          def total = atts.getValue('total')

          switch (atts.getValue('done')) {

          case'0' : upcoming << title ; break

          case { it != total } : underway << title ; break

          }

          }

          }

          def handler = new PlanHandler()

          def reader = SAXParserFactory.newInstance()

          .newSAXParser().xMLReader

          reader.contentHandler = handler

          def inputStream = new FileInputStream('data/plan.xml')

          reader.parse(new InputSource(inputStream))

          inputStream.close()

          assert handler.underway == [

          'use in current project'

          ]

          assert handler.upcoming == [

          're-read DB chapter',

          'use DB/XML combination'

          ]

          說實話,Groovy在至少在編寫小程序上來說比java要方便很多。

          posted on 2007-09-24 16:55 花開有時 閱讀(1971) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: 成功!用SAX讀取XML文件。  回復  更多評論   

          恭喜樓主
          2007-09-27 19:26 | 千里冰封
          主站蜘蛛池模板: 特克斯县| 镇坪县| 景洪市| 元朗区| 瑞安市| 贵阳市| 南澳县| 林甸县| 岱山县| 普兰店市| 开阳县| 宣汉县| 井冈山市| 鹤岗市| 稻城县| 呼伦贝尔市| 高尔夫| 上饶县| 星座| 嘉定区| 水城县| 麦盖提县| 普陀区| 即墨市| 东兴市| 临高县| 疏勒县| 华亭县| 泊头市| 赣榆县| 砀山县| 如东县| 汾阳市| 阜新| 安新县| 富源县| 隆安县| 泗洪县| 新巴尔虎左旗| 顺平县| 筠连县|