天天看點

xml文檔的pull解析與SAX解析

一、Pull解析:

1.在java中的使用方法:                                                        

1)首先InputStream ins = this.getClass().getClassLoader().

     getResourceAsStream("xxx.xml");擷取到一個流對象                           

2)擷取xml的解析工廠對象XmlPullParserFactory factory = XmlPullParserFactory.newInstance();                                                 

3)通過解析工廠擷取xml解析器XmlPullParser parser = factory.newPullParser();   

4)綁定需要解析的xml檔案以及設定解編碼格式,應該與xml檔案的編碼格式一緻parser.setInput(ins, "UTF-8");                                                 

5)擷取解析指針指向的目前标簽類型int type = parser.getEventType();             

6)通過指針周遊xml檔案while(type != XmlPullParser.END_DOCUMENT)在循環體内執行你需要的操作,别忘了執行完操作移動指針指向下一個标簽parser.next()                              

 2.在Android中的使用方法:Android中的解析器構造方式與java不同因為都封裝好了                    

XmlPullParser xpp = Xml.newPullParser();其他的與java都一樣

Android中的代碼示例:

private void parseXMLwithPull(InputStream input) {

    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(input,"UTF-8");
        int type = parser.getEventType();
        String id = "";
        String name = "";
        String version = "";

        while (type != XmlPullParser.END_DOCUMENT) {

            String nodeName = parser.getName();
            switch (type) {

                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.i("zhangdi",id);
                        Log.i("zhangdi",name);
                        Log.i("zhangdi",version);
                    }
                    break;
            }
            type = parser.next();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}      

二、SAX解析:

1.建立一個SAXHandler類繼承DefaultHandler,重寫startDocument(開始xml解析的時候調用)、endDocument(結束xml解析的時候調用)、startElement(解析某個節點的時候調用)、endElement(完成解析某個節點的時候調用)以及characters(擷取節點内容的時候調用)這5個方法;

2.建構xml解析工廠XMLParserFactory factory = XMLParserFactory.newInstance();

3.通過解析工廠擷取XMLReader reader = factory.newSAXParser.getXMLReader();

4.設定reader的解析handler reader.setContentHandler(new SAXHandler());

5.解析資料reader.parse();

Android示例代碼:

1.SAXHandler:

public class SAXHandler extends DefaultHandler {

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

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

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        nodeName = localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if ("app".equals(localName)) {
            Log.i("zhangdi",id.toString());
            Log.i("zhangdi",name.toString());
            Log.i("zhangdi",version.toString());
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        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);
        }
    }
}      

2.具體解析步驟:

private void parseXMLwithSAX(String string) {

    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader reader = factory.newSAXParser().getXMLReader();
        SAXHandler handler = new SAXHandler();
        reader.setContentHandler(handler);
        reader.parse(new InputSource(new StringReader(string)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}