PULLとSAX解析xmlファイル

10568 ワード

最近androidについて勉強していますが、今日はPULLとSAXの2つの異なる方法でxmlファイルを解析することについて見ました.ここで簡単にまとめます.
SAXは「プッシュ」に基づく解析方式で、登録されたイベントプロセッサに自動的にイベントをプッシュして処理するので、イベント処理のアクティブな終了を制御することはできません.SAX方式でxmlドキュメントを解釈する場合、一度にドキュメント全体をメモリに読み込んで解析するのではなく、ドキュメントを読み取る過程で解析しますが、SAXはxmlドキュメントを解析する際に、ドキュメント内のすべてのノードを遍歴します.したがって、xmlドキュメントの前の部分が必要な場合、この方法を採用すると、リソースが浪費されます.
PULLは「プル」ベースの解析方式で、アプリケーションは私たち自身のニーズに応じて解析器の読み取りを制御することができます.アプリケーションコードをプロアクティブに解析器からイベントを取得することで、必要なコンテンツを取得した後、解析を終了できます.
次に、xmlファイルを解析する2つの方法の簡単な例について説明します.1.解析する必要があるxmlファイルは以下の通りです.
<apps>
    <app>
        <id>1id>
        <name>aname>
        <version>1.0version>
    app>
    <app>
        <id>2id>
        <name>bname>
        <version>1.1version>
    app>
apps>

2.PULL方式でxmlファイルを解析する
    //  pull    xml    
    private void parseXMLWithPull(String xmlData){

        String id = "";
        String name = "";
        String version = "";

        try {
            //    pull   
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(new StringReader(xmlData));

            //         
            int eventType = parser.getEventType();
            while(eventType != XmlPullParser.END_DOCUMENT){

                //      
                String nodeName = parser.getName();
                switch (eventType){

                    //        
                    case XmlPullParser.START_TAG:
                        if("id".equals(nodeName)){
                            id = parser.nextText();
                        }else if("name".equals(nodeName)){
                            name = parser.nextText();
                        }else if("version".equals(nodeName)){
                            version = parser.nextText();
                        }
                        break;

                    //        
                    case XmlPullParser.END_TAG:
                        if("app".equals(nodeName)){
                            Log.d("Main2Activity",id);
                            Log.d("Main2Activity", name);
                            Log.d("Main2Activity", version);
                        }
                        break;
                    default:
                        break;
                }
                eventType = parser.next();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.SAX方式でxmlファイルを解析する
public class MyHandler extends DefaultHandler{

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;


    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }

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

        nodeName = localName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        if("id".equals(nodeName)){
            id.append(ch, start, length);
        }else if("name".equals(nodeName)){
            name.append(ch, start, length);
        }else if("version".equals(nodeName)){
            version.append(ch, start, length);
        }

    }

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

        if("app".equals(nodeName)){
            Log.d("ContentHandler", id.toString());
            Log.d("ContentHandler", name.toString());
            Log.d("ContentHandler", version.toString());
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {

        super.endDocument();
    }
}
    //  SAX    xml  
    private void parseXMLWithSax(String xmlData){

        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = null;
        try {
            xmlReader = factory.newSAXParser().getXMLReader();
            MyHandler myHandler = new MyHandler();
            xmlReader.setContentHandler(myHandler);
            xmlReader.parse(new InputSource(new StringReader(xmlData)));
        }catch (Exception e){
            e.printStackTrace();
        }
    }