xml文档的pull解析与SAX解析

来源:互联网 发布:网络哪个国家强 编辑:程序博客网 时间:2024/05/19 18:48

一、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(newSAXHandler());

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();    }}