android XML数据解析

来源:互联网 发布:nginx conf 配置php 编辑:程序博客网 时间:2024/06/05 18:07

网络下载的数据主要有两种格式XML和JSON,但是这两种数据格式都有自己的格式符,解析数据就是从这两种格式的数据中取出我们需要的数据,去掉格式符。本文记录了两种常用XML解析方法:

JSON数据解析方法:http://blog.csdn.net/q296264785/article/details/53909442

XML数据解析常用方法之PULL解析方法:

private void XMLWithPull(String xmlData){//XML数据解析 pull方式        try {            //1、获得一个XmlPullParserFactory实例            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();            //2、通过XmlPullParserFactory实例得到XmlPullParser对象            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();            //3、加载需要解析的数据            xmlPullParser.setInput(new StringReader(xmlData));r            //得到当前解析事件            int eventType = xmlPullParser.getEventType();            String id = "";            String name = "";            String version = "";            //如果解析事件不等于END_DOCUMENT,说明解析还没完成,需要继续解析            while(eventType != XmlPullParser.END_DOCUMENT){                //获得当前解析节点的名字                String nodeName = xmlPullParser.getName();                switch (eventType){                    case XmlPullParser.START_TAG:                        if("id".equals(nodeName)){                            id = xmlPullParser.nextText();//获取节点的内容并且赋值到对应变量                        }else if("name".equals(nodeName)){                            name = xmlPullParser.nextText();                        }else if("version".equals(nodeName)){                            version = xmlPullParser.nextText();                        }                        break;                    //解析完一个节点后将数据输出                    case XmlPullParser.END_TAG:                        if("app".equals(nodeName)){                            Log.d("MainActivity", "id is " + id);                            Log.d("MainActivity", "name is " + name);                            Log.d("MainActivity", "version is " + version);                        }                        break;                    default:break;                }                //切换到下一个节点                eventType = xmlPullParser.next();            }        } catch (XmlPullParserException e) {            e.printStackTrace();        }catch (IOException e) {            e.printStackTrace();        }    }

XML数据解析常用方法之SAX解析方法:
SAX解析方法需要实现一个DefaultHandler 的子类并且重写相关的方法。方法的作用可以对应PULL解析理解。

public class ContentHandler extends DefaultHandler {    private String nodeName;    private StringBuilder id;    private StringBuilder name;    private StringBuilder version;    @Override    public void startDocument() throws SAXException {//开始解析XML的时候调用        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)){            name.append(ch, start, length);        }    }    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {//完成某个节点的时候调用        if("app".equals(localName)){            Log.d("MainActivity", "id is " + id.toString().trim());            Log.d("MainActivity", "name is " + name.toString().trim());            Log.d("MainActivity", "version is " + version.toString().trim());            id.setLength(0);            name.setLength(0);            version.setLength(0);        }    }    @Override    public void endDocument() throws SAXException {//完成整个解析的时候调用        super.endDocument();    }}

实例化DefaultHandler 子类,通过相关方法赋值解析数据。

private void XMLWithSAX(String xmlData){        SAXParserFactory factory = SAXParserFactory.newInstance();        try {            XMLReader xmlReader = factory.newSAXParser().getXMLReader();            ContentHandler contentHandler = new ContentHandler();            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();        }    }

解析的XML目标数据:

<apps><app><id>1</id><name>aa</name><version>1.0</version></app><app><id>2</id><name>Hello</name><version>1.2</version></app><app><id>3</id><name>bb</name><version>1.8</version></app></apps>
0 0