解析XML數據

解析XML數據

其實就是已有的工具使用方法,特別白癡的做法,記住就好了。貴在實際項目中融會貫通

Pull解析方式

    private void parseXmlWithPull(String xmlData) {
        try {
            //創建實例
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            //得到對象
            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
            //設置xml數據
            xmlPullParser.setInput(new StringReader(xmlData));
            String id = "";
            String name = "";
            String verson = "";
            //得到當前的解析事件,若不等於1:說明解析工作還沒有完成,調用next獲取下一個解析事件
            int eventType = xmlPullParser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                //拿到當前節點名
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    //開始解析2
                    case XmlPullParser.START_TAG:
                        if ("id".equals(nodeName)) {
                            //獲取節點內容
                            id = xmlPullParser.nextText();
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                        }else if("verson".equals(nodeName)){
                            verson=xmlPullParser.nextText();
                        }
                        break;
                        //解析完成3
                    case XmlPullParser.END_TAG:
                        if("app".equals(nodeName)){
                            Log.i(TAG, "parseXmlWithPull: "+"id is"+id);
                        }
                        break;
                    default:
                        break;
                }
                eventType=xmlPullParser.next();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
    }

SAX解析方式

  • 先建一個Handler繼承DefaultHandler
/**
 * git_workspace
 *
 * @author liyuanli
 * @data 2017/10/31
 */

public class ContentHandler extends DefaultHandler {

    private String nodeName;

    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder verson;

    private String TAG="ContentHandler";

    /**
     * 開始解析xml時調用
     * 這裏初始化StringBuilder對象
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();

        id=new StringBuilder();
        name=new StringBuilder();
        verson=new StringBuilder();
    }

    /**
     * 完成整個xml解析時調用
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    /**
     * 開始解析某個節點是調用
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //記錄當前節點名
        nodeName=localName;
    }

    /**
     * 完成解析某個節點時調用
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if("app".equals(localName)){
            Log.i(TAG, "endElement: "+"id is "+id.toString().trim());
            //最後要將StirngBuilder清空掉
            id.setLength(0);
        }
    }

    /**
     * 讀取節點內容時調用
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        //根據當前節點名判斷將內容添加到那個StirngBuilder對象中
        if ("id".equals(nodeName)){
            id.append(ch,start,length);
        }else if ("name".equals(nodeName)){
            name.append(ch,start,length);
        }else if ("verson".equals(nodeName)){
            verson.append(ch,start,length);
        }
    }
}
  • 調用Handler解析
    private void parseXMLWithSAX(String xmlData){
        try {
            SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
            XMLReader xmlReader=saxParserFactory.newSAXParser().getXMLReader();
            ContentHandler contentHandler=new ContentHandler();
            //將ContentHandler的實例設置到XMLReader中
            xmlReader.setContentHandler(contentHandler);
            //開始執行解析
            xmlReader.parse(new InputSource(new StringReader(xmlData)));
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
發佈了48 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章