解析XML格式数据

来源:互联网 发布:硬妹风的淘宝店 编辑:程序博客网 时间:2024/06/02 10:24

Pull解析

首先获取到一个XmlPullParserFactory的实例,再调用setInput()方法将xml数据返回到当前的事件。通过getEventType()方法可以得到当前的解析事件

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();xmlPullParser.setInput(new StringReader(xmlData));int eventType = xmlPullParser.getEventType();

再在while循环中不断解析,如果当前事件不等于XmlPullParser.END_DOCUMENT,说明解析没有完成,调用next()方法后可以获取下一个解析事件,在循环中,用getName来获取当前节点的名字,然后调用nextText()方法获得节点内容。
这里有一份准备好的数据文件。


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("id",id);                Log.d("name",name);                Log.d("version",version);            }            break;        }    }    eventType = xmlPullParser.next();}

SAX解析

SAX用法比Pull要复杂一些,但是语义方面会更加清楚。通常情况下新建一个类并且继承DefaultHandler,并重写父类的5个方法

public class MyHandler extends DefaultHandler {    private String nodeName;    private StringBuilder id;    private StringBuilder name;    private StringBuilder version;    //开始XML解析时调用    @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("id", id.toString().trim());            Log.d("name",name.toString().trim());            Log.d("version",version.toString().trim());            //清空StringBuilder            id.setLength(0);            name.setLength(0);            version.setLength(0);        }    }    //完成解析XML时调用    @Override    public void endDocument() throws SAXException {        super.endDocument();    }}

接下来的工作和Pull差不多

SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = factory.newSAXParser().getXMLReader();MyHandler handler = new MyHandler();xmlReader.setContentHandler(handler);//开始执行解析xmlReader.parse(new InputSource(new StringReader(xmlData)));
原创粉丝点击