隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 155773
          • 排名 - 390

          最新評論

          [標題]:[原]SAX使用示例
          [時間]:2009-4-25
          [摘要]:本文介紹了SAX解析XML的方法。還闡述了創建XMLReader兩種方法。一種是使用javax.xml.parsers.SAXParser驅動,另一種是使用第三方驅動org.apache.xerces.parsers.SAXParser。
          [關鍵字]:XML, Java,SAX,SAX Driver,SAX 驅動 , XMLReader,
          xerces,SAX2.0,JAXP,
          "System property org.xml.sax.driver not specified",
          "SAX2 driver class org.apache.xerces.parsers.SAXParser not found"
          [環境]:SAX 2.0 ,Xerces-J 2.9.1
          [作者]:Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys

          [正文]:
              1、SAX2.0使用org.xml.sax.XMLReader接口代替了Parser接口。如果要使用SAX解析XML,那么首先要獲得XMLReader的一個實現對象。
             
              (1)、使用javax.xml.parsers.SAXParser創建XMLReader
                  Sun JDK提供了javax.xml.parsers.SAXParser,由SAXParser可以獲取一個XMLReader。由于javax.xml.parsers.SAXParser是JDK自帶驅動,所以,直接編譯就可以運行了。           
          SAXParserFactory factory = SAXParserFactory.newInstance();
          factory.setValidating(true);//開啟驗證XML功能
          SAXParser parser = factory.newSAXParser();
          XMLReader reader = parser.getXMLReader();

              (2)、使用第三方驅動。本例使用Xerces驅動:               org.apache.xerces.parsers.SAXParser。
                  Xerces驅動下載地址:http://xerces.apache.org/xerces2-j/。
                  下載后,找到xercesImpl.jar,并將其加入到classpath路徑中。如果不加入classpath路徑,可以在編譯運行時指定xercesImpl.jar的位置。例:
          javac -cp "xercesImpl.jar;." SAXDemo.java
          java -cp "xercesImpl.jar;." SAXDemo

                  此時,創建XMLReader代碼如下:
          XMLReader reader = XMLReaderFactory.createXMLReader();
                  但是運行時要指定驅動的位置:
          java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser SAXDemo

                  也可以在代碼中指定具體驅動:
          String driver = "org.apache.xerces.parsers.SAXParser";
          XMLReader reader = XMLReaderFactory.createXMLReader(driver);
                  或者直接創建一個XMLReader:
          XMLReader reader = new org.apache.xerces.parsers.SAXParser();
              2、得到XMLReader對象之后就可以解析XML了。SAX是基于事件的,所以,還要設置內容事件處理器ContentHandler和其它事件處理器,DefaultHandler是對ContentHandler等事件處理接口的一個默認實現,如果熟悉AWT/Swing事件處理機制,便不難理解。當然還需要一個InputSource來指定所要解析的XML文件。
          reader.setFeature("http://xml.org/sax/features/validation", false);
          reader.setContentHandler(mySAXHandler);
          reader.setErrorHandler(mySAXHandler);

          reader.parse(input);//input是InputSouce類型
             3、SAX解析XML完整的代碼實現(注釋中包含使用Xerces驅動的方法,可根據需要刪除或選用):
          /**
           * SAX使用示例
           *
           *Usage:
           *如果未用到Xerces驅動,則直接編譯運行。
           *如果用Xerces驅動,則編譯運行如下:
           * javac -cp "xercesImpl.jar;." SAXDemo.java
           * java -cp "xercesImpl.jar;." SAXDemo
           *
           * @version 2009-4-25
           * @author Winty(wintys@gmail.com)
           */
          import java.io.*;

          import javax.xml.parsers.SAXParserFactory;
          import javax.xml.parsers.SAXParser;
          import javax.xml.parsers.ParserConfigurationException;

          import org.xml.sax.XMLReader;
          import org.xml.sax.InputSource;
          import org.xml.sax.SAXException;
          import org.xml.sax.Attributes;
          import org.xml.sax.SAXParseException;

          import org.xml.sax.helpers.DefaultHandler;
          import org.xml.sax.helpers.XMLReaderFactory;

          public class SAXDemo extends DefaultHandler{
              Writer writer;
              InputSource input;

              public SAXDemo(InputSource input ,  Writer writer){
                  this.input = input;
                  this.writer = writer;
              }

              public static void main(String[] args)throws Exception{
                  InputSource input;
                  Writer writer;
                  SAXDemo saxDemo;

                  input = new InputSource(new FileReader("cdcatalog.xml"));
                  writer = new OutputStreamWriter(System.out);
                  //writer = new FileWriter("result.txt");
                  saxDemo= new SAXDemo(input , writer);

                  saxDemo.parse();
              }

              public void parse(){
                  XMLReader reader;
                  try{
                      reader = getXMLReader_Java();

                      /*方法2:
                      使用Xerces驅動:org.apache.xerces.parsers.SAXParser,
                      需指定:java -cp "xercesImpl.jar;." SAXDemo
                      */
                      //如果使用Xerces驅動,則去除相應方法的注釋即可。
                      //reader = getXMLReader_Xerces1();
                      //reader = getXMLReader_Xerces2();
                      //reader = getXMLReader_Xerces3();
                     
                      MySAXHandler mySAXHandler = new MySAXHandler(writer);
                      reader.setFeature("http://xml.org/sax/features/validation", false);
                      reader.setContentHandler(mySAXHandler);
                      reader.setErrorHandler(mySAXHandler);

                      reader.parse(input);
                  }catch(SAXException e){
                      System.err.println(e.getMessage());
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              //方法1:使用javax.xml.parsers.SAXParser驅動
              private XMLReader getXMLReader_Java()throws SAXException {
                  XMLReader reader = null;
                  try{
                      SAXParserFactory factory = SAXParserFactory.newInstance();
                      factory.setValidating(true);
                      SAXParser parser = factory.newSAXParser();
                      reader = parser.getXMLReader();
                  }catch(ParserConfigurationException e){
                      System.err.println(e.getMessage());
                  }

                  return reader;
              }

              /**
               *方法2-1:
               */
              /*private XMLReader getXMLReader_Xerces1()throws SAXException{
                  String driver = "org.apache.xerces.parsers.SAXParser";

                  return XMLReaderFactory.createXMLReader(driver);
              }*/

              /* 方法2-2:
               * 還需指定driver類: java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser
               */
              /*private XMLReader getXMLReader_Xerces2()throws SAXException{
                  return XMLReaderFactory.createXMLReader();
              }*/

              /**
               * 方法2-3:
               * 還需指定:javac -cp "xercesImpl.jar;."
               */
              /*private XMLReader getXMLReader_Xerces3()throws SAXException{
                  return (new org.apache.xerces.parsers.SAXParser());
              }*/
          }

          class MySAXHandler extends DefaultHandler{
              private Writer writer;

              public MySAXHandler(Writer writer){
                  this.writer = writer;
              }

              public void startDocument()throws SAXException{
                  try{
                      writer.write("開始解析XML\n");
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              public void endDocument()throws SAXException{
                  try{
                      writer.write("\n解析XML結束");
                      writer.close();
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              public void startElement(String uri,
                                                   String localName,
                                                   String qName,
                                                   Attributes attributes)
                  throws SAXException{

                  try{
                      writer.write("<" + qName + ">");
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              public void endElement(String uri,
                                                  String localName,
                                                  String qName)
                  throws SAXException{

                  try{
                      writer.write("</" + qName + ">");
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              public void characters(char[] ch,int start,int length)throws SAXException{
                  try{
                      String str = new String(ch , start , length);
                      writer.write(str);
                  }catch(IOException e){
                      System.err.println(e.getMessage());
                  }
              }

              public void error(SAXParseException e)throws SAXException{
                  System.err.println(e.getMessage());
              }

              public void warning(SAXParseException e)throws SAXException{
                  System.err.println(e.getMessage());
              }

              public void fatalError(SAXParseException e)throws SAXException{
                  System.err.println(e.getMessage());
              }
          }

          附件下載(附件內容:xercesImpl.jar、SAXDemo.java、cdcatalog.xml):SAXDemo.zip
          原創作品,轉載請注明出處。
          作者:Winty (wintys@gmail.com)
          博客:http://www.aygfsteel.com/wintys

          posted on 2009-04-26 19:18 天堂露珠 閱讀(2559) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 海宁市| 阳西县| 搜索| 婺源县| 偃师市| 类乌齐县| 湾仔区| 平陆县| 广宗县| 孟连| 温泉县| 合作市| 望城县| 克东县| 宁安市| 绥棱县| 美姑县| 德化县| 天全县| 桦甸市| 皋兰县| 福建省| 科尔| 抚州市| 琼结县| 孝义市| 双牌县| 女性| 张家港市| 遵义县| 陵川县| 娄烦县| 侯马市| 莆田市| 漠河县| 清水河县| 巴彦淖尔市| 缙云县| 洪洞县| 灵寿县| 尉犁县|