<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 117  文章 - 72  trackbacks - 0

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

    常用鏈接

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

    訂閱

    訂閱

    留言簿(7)

    隨筆分類(130)

    隨筆檔案(123)

    搜索

    •  

    積分與排名

    • 積分 - 155536
    • 排名 - 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://m.tkk7.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://m.tkk7.com/wintys

    posted on 2009-04-26 19:18 天堂露珠 閱讀(2557) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲国产精品久久久久婷婷老年| 国产啪亚洲国产精品无码| 91久久亚洲国产成人精品性色| 一级做a免费视频观看网站| 亚洲av无码乱码在线观看野外 | 亚洲爆乳精品无码一区二区三区 | 亚洲an日韩专区在线| 天天影院成人免费观看| 亚洲女人初试黑人巨高清| 午夜免费1000部| 久久乐国产综合亚洲精品| 波多野结衣久久高清免费 | 亚洲精品国产精品国自产观看| 搜日本一区二区三区免费高清视频 | 成人永久免费福利视频网站| 国产精品亚洲专区无码WEB| 免费人成在线观看播放国产 | 亚洲人成电影网站免费| 免费国产一级特黄久久| 99免费在线视频| 亚洲福利在线观看| 一区二区无码免费视频网站| 国产精品亚洲天堂| 好看的亚洲黄色经典| 免费观看黄色的网站| 精品国产亚洲AV麻豆| 亚洲色婷婷综合久久| 18禁美女裸体免费网站| 精品国产日韩亚洲一区在线| 日本亚洲成高清一区二区三区| 亚洲免费福利视频| 精品女同一区二区三区免费播放| 国产成人亚洲精品狼色在线| 95老司机免费福利| 美女被爆羞羞网站在免费观看| 久久亚洲精品成人综合| 蜜臀91精品国产免费观看| 男人天堂免费视频| 亚洲人成网站色7799| 亚洲欧洲∨国产一区二区三区| 国产乱码免费卡1卡二卡3卡|