花開有時(shí)

          花開有時(shí),花落有時(shí),來(lái)有時(shí),去有時(shí)。不撕扯,只關(guān)切;不紀(jì)念,只牽掛;不感動(dòng),只明白;不尋找,只記得。
          隨筆 - 24, 文章 - 0, 評(píng)論 - 54, 引用 - 0
          數(shù)據(jù)加載中……

          成功!用SAX讀取XML文件。

          上次是用DOM讀取的XML文件,我接著書往下讀又發(fā)現(xiàn)了用SAX讀取文件的方法,當(dāng)然是用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;

              }

          }

          輸出結(jié)果是:

          [use in current project]

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

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

          下面是書上用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'

          ]

          說(shuō)實(shí)話,Groovy在至少在編寫小程序上來(lái)說(shuō)比java要方便很多。

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

          評(píng)論

          # re: 成功!用SAX讀取XML文件。  回復(fù)  更多評(píng)論   

          恭喜樓主
          2007-09-27 19:26 | 千里冰封
          主站蜘蛛池模板: 德阳市| 江孜县| 雷山县| 晋中市| 天台县| 万源市| 塔河县| 东阿县| 海晏县| 闸北区| 称多县| 肇源县| 耒阳市| 遵义市| 海林市| 阿拉善右旗| 来安县| 常熟市| 旬阳县| 彭州市| 余干县| 曲阳县| 白玉县| 扬中市| 江口县| 大安市| 隆子县| 如皋市| 麻栗坡县| 双鸭山市| 宣威市| 瑞金市| 龙山县| 紫云| 南昌市| 英山县| 南投县| 焉耆| 龙江县| 阳谷县| 大方县|