使用SAX解析XML文檔

          步驟1.一個簡單的XML文檔:
          ???XML代碼:
          <?xml?version="1.0"?encoding="GBK"?>??
          <StudentInfo>??
          ????
          <student>??
          ????????
          <name>趙海波</name>??
          ????????
          <sex></sex>??
          ????????
          <lesson>??
          ????????????
          <lessonName>Spring整合開發</lessonName>??
          ????????????
          <lessonScore>85</lessonScore>??
          ????????
          </lesson>??
          ????????
          <lesson>??
          ????????????
          <lessonName>輕量級J2EE應用開發</lessonName>??
          ????????????
          <lessonScore>95</lessonScore>??
          ????????
          </lesson>??
          ????????
          <lesson>??
          ????????????
          <lessonName>Ajax應用開發</lessonName>??
          ????????????
          <lessonScore>80</lessonScore>??
          ????????
          </lesson>??
          ????
          </student>??
          ????
          <student>??
          ????????
          <name>程衛娜</name>??
          ????????
          <sex></sex>??
          ????????
          <lesson>??
          ????????????
          <lessonName>Spring整合開發</lessonName>??
          ????????????
          <lessonScore>80</lessonScore>??
          ????????
          </lesson>??
          ????????
          <lesson>??
          ????????????
          <lessonName>輕量級J2EE應用開發</lessonName>??
          ????????????
          <lessonScore>85</lessonScore>??
          ????????
          </lesson>??
          ????????
          <lesson>??
          ????????????
          <lessonName>Ajax應用開發</lessonName>??
          ????????????
          <lessonScore>90</lessonScore>??
          ????????
          </lesson>??
          ????
          </student>??
          </StudentInfo>??

          步驟2.用于處理XML文檔的事件監聽器:
          ???Java代碼:

          import?org.xml.sax.*;???
          public?class?XMLContentHandler?implements?ContentHandler???
          {??????
          ????
          //DTD中定義的元素名???
          ????private?static?final?String?ELEMENT_NAME?=?"name";???
          ????
          private?static?final?String?ELEMENT_SEX?=?"sex";???
          ????
          private?static?final?String?ELEMENT_LESSON?=?"lesson";???
          ????
          private?static?final?String?ELEMENT_LESSON_NAME?=?"lessonName";???
          ????
          private?static?final?String?ELEMENT_LESSON_SCORE?=?"lessonScore";???
          ????
          private?static?final?String?ELEMENT_STUDENT?=?"student";???
          ????
          private?static?final?String?ELEMENT_LINE?=?"breakLine";????
          ????
          //當前元素的數據???
          ????private?String?currentData?=?"";???
          ????
          private?String?lessonName?=?"";???
          ????
          private?String?lessonScore?=?"";???
          ????
          //當其他某一個調用事件發生時,先調用此方法來在文檔中定位。???
          ????public?void?setDocumentLocator(Locator?locator)???
          ????
          {???
          ????}
          ???
          ????
          //在解析整個文檔開始時調用???
          ????public?void?startDocument()?throws?SAXException???
          ????
          {???
          ????????System.out.println(
          "XML文件開始解析");???
          ????}
          ???
          ????
          //在解析整個文檔結束時調用???
          ????public?void?endDocument()?throws?SAXException???
          ????
          {???
          ????????System.out.println(
          "XML文件解析結束");???
          ????}
          ???
          ????
          //?在解析命名空間開始時調用???
          ????public?void?startPrefixMapping(String?prefix,?String?uri)?throws?SAXException???
          ????
          {???
          ????????System.out.println(
          "XML解析器開始解析命名空間");???
          ????}
          ???
          ????
          //在解析命名空間結束時調用???
          ????public?void?endPrefixMapping(String?prefix)?throws?SAXException???
          ????
          {???
          ????????System.out.println(
          "XML解析器解析命名空間結束");???
          ????}
          ???
          ????
          //在解析元素開始時調用???
          ????public?void?startElement(String?namespaceURI,?String?localName,String?qName,?Attributes?atts)?throws?SAXException???
          ????
          {???
          ????????System.out.println(
          "XML解析器開始解析元素"?+?localName);???
          ????}
          ???
          ????
          //在解析元素結束時調用???
          ????public?void?endElement(String?namespaceURI,?String?localName,?String?qName)?throws?SAXException???
          ????
          {???
          ????????
          if?(localName.equals(ELEMENT_NAME))???
          ????????
          {???
          ????????????System.out.println(localName?
          +?"????:????"?+?currentData);???
          ????????}
          ???
          ????????
          if?(localName.equals(ELEMENT_SEX))???
          ????????
          {???
          ????????????System.out.println(localName?
          +?"?????:?????"?+?currentData);???
          ????????}
          ???
          ????????
          if?(localName.equals(ELEMENT_LESSON_NAME))???
          ????????
          {???
          ????????????
          this.lessonName?=?currentData;???
          ????????}
          ???
          ????????
          if?(localName.equals(ELEMENT_LESSON_SCORE))???
          ????????
          {???
          ????????????
          this.lessonScore?=?currentData;???
          ????????}
          ???
          ????????
          if?(localName.equals(ELEMENT_LESSON))???
          ????????
          {???
          ????????????System.out.println(lessonName?
          +?"??????:?????"?+?lessonScore);???
          ????????}
          ???
          ????????System.out.println(
          "XML解析器解析元素"?+?localName?+?"結束");???
          ????}
          ???
          ????
          //?取得元素數據???
          ????public?void?characters(char[]?ch,?int?start,?int?length)?throws?SAXException???
          ????
          {???
          ????????currentData?
          =?new?String(ch,?start,?length).trim();???
          ????????System.out.println(
          "XML解析器成功解析到元素數據");???
          ????}
          ???
          ????
          //取得元素數據中的空白???
          ????public?void?ignorableWhitespace(char[]?ch,?int?start,?int?length)?throws?SAXException???
          ????
          {???
          ????}
          ???
          ????
          //在解析到處理指令時,調用此方法。???
          ????public?void?processingInstruction(String?target,?String?data)?throws?SAXException???
          ????
          {???
          ????}
          ???
          ????
          //當未驗證解析器忽略實體時調用此方法???
          ????public?void?skippedEntity(String?name)?throws?SAXException???
          ????
          {???
          ????}
          ???
          }
          ??

          步驟3.通過主程序開始解析XML文檔,解析XML文檔的代碼如下:
          ???java代碼:
          import?java.io.*;???
          import?org.xml.sax.*;???
          import?org.xml.sax.helpers.*;???
          public?class?SAXParser???
          {???
          ????
          public?static?void?main(String[]?args)???
          ????
          {???
          ????????SAXParser?sax?
          =?new?SAXParser();???
          ????????sax.parseXMLFile(
          "student.xml");???
          ????}
          ???
          ????
          //?解析文檔???
          ????private?void?parseXMLFile(String?fileName)???
          ????
          {??????????
          ????????
          try??
          ????????
          {???
          ????????????
          //通過指定解析器的名稱來動態加載解析器???
          ????????????XMLReader?parser?=?XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");???
          ????????????
          //處理內容前要注冊內容管理器???
          ????????????parser.setContentHandler(new?XMLContentHandler());???
          ????????????
          //開始解析文檔???
          ????????????parser.parse(fileName);???
          ????????}
          ???
          ????????
          catch?(IOException?e)???
          ????????
          {???
          ????????????e.printStackTrace();???
          ????????}
          ???
          ????????
          catch?(SAXException?e)???
          ????????
          {???
          ????????????e.printStackTrace();???
          ????????}
          ???
          ????}
          ???
          }
          ??

          posted on 2008-09-28 11:09 nonels 閱讀(1771) 評論(5)  編輯  收藏 所屬分類: J2EE

          評論

          # re: 使用SAX解析XML文檔[未登錄] 2009-05-22 14:44 tiger

          您寫的很清楚,謝謝啊,中國需要這樣的人才,支持您,我也是研究xml應用的研究生,不過自己剛開始學習,看過您的文檔后收獲很多。我的郵箱是tjnuwanghu◎163.com 最近在做個導師給的任務,要將一個xml文檔解析成類似注冊表那樣的列表,用的解析器是xerces-c++,自己在虛擬機linux上安裝了此解析器,但還是不會用它寫程序來簡單解析xml文檔,您有時間了給我看看,舉個例子,先謝謝您哦。

          徒弟  回復  更多評論   

          # re: 使用SAX解析XML文檔 2009-08-07 08:51 路過

          樓上的 如果你真的是研究生的話 那中國完了 我是一高中生 上面的例子也沒什么難的   回復  更多評論   

          # re: 使用SAX解析XML文檔 2009-08-12 14:42 心靈探索者

          聞道有先后,授業有專攻  回復  更多評論   

          # re: 使用SAX解析XML文檔 2009-08-17 22:24 Fucher

          高中生很適合干這個。  回復  更多評論   

          # re: 使用SAX解析XML文檔 2009-12-02 23:27 hello

          研究生? 雷死...  回復  更多評論   

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(16)

          隨筆檔案(16)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂川县| 双峰县| 琼中| 普宁市| 黄浦区| 东山县| 梁山县| 洛隆县| 拜泉县| 达州市| 彰化县| 宝山区| 竹山县| 扎囊县| 盐源县| 万山特区| 浮山县| 将乐县| 清苑县| 双城市| 微山县| 安达市| 同江市| 鄯善县| 云安县| 福州市| 日土县| 醴陵市| 景东| 嘉峪关市| 茌平县| 江达县| 东乌珠穆沁旗| 静海县| 内江市| 台北县| 韶山市| 当阳市| 且末县| 海宁市| 抚州市|