解析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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章