android开发第四天xml文件解析

1.sax方式

复制代码
/**
 * 使用sax解析
 */
public class SaxParse{

    /**
     * sax解析器
     */
    private SAXParser parser;
    
    public SaxParse(){
        try {
            SAXParserFactory f = SAXParserFactory.newInstance();
            parser = f.newSAXParser();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public List<Person> doParse(InputStream is) {
        try {
            XmlHandler h = new XmlHandler();
            parser.parse(is,h);
            return h.getpersons();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 处理器
     */
    class XmlHandler extends DefaultHandler{
        List<Person> persons = null ;
        Person person = null ;
        
        //当前元素名称
        private String currEleName;
        
        /**
         * 文本节点触发该方法
         */
        public void characters(char[] ch, int start, int length)throws SAXException {
            String str = new String(ch,start,length);
            //name
            if("name".equals(currEleName)){
                person.name = str ;
            }
            else if("age".equals(currEleName)){
                person.age = Integer.parseInt(str);
            }
        }

        public void endDocument() throws SAXException {
        }

        /**
         * 元素结束
         */
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            if("person".equals(localName)){
                persons.add(person);
            }
            //将当前元素置空
            else if(("name".equals(currEleName)) || ("age".equals(currEleName))){
                this.currEleName = "" ;
            }
        }

        /**
         * 文档开始事件
         */
        public void startDocument() throws SAXException {
            persons = new ArrayList<Person>();
        }

        /**
         * 元素开始事件
         * localName:本地名
         * uri:名字空间
         * qName:限定名,前缀 + 本地名
         */
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            //实例化person对象
            if("person".equals(localName)){
                person = new Person();
                person.id = Integer.parseInt(attributes.getValue(0));
            }
            //name元素
            else if("name".equals(localName)){
                this.currEleName = "name" ;
            }
            //name元素
            else if("age".equals(localName)){
                this.currEleName = "age" ;
            }
        }
        
        public List<Person> getpersons(){
            return persons ;
        }
    }
}
复制代码

2.dom方式

复制代码
/**
 * DOM解析
 */
public class DomParse{

    //
    private DocumentBuilder builder;
    
    public DomParse(){
        try {
            DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
            this.builder = f.newDocumentBuilder();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public List<Person> doParse(InputStream is) {
        List<Person> persons = new ArrayList<Person>();
        Person person = null ;
        try {
            Document doc = builder.parse(is);
            NodeList list = doc.getElementsByTagName("person");
            Element ele = null ;
            for(int i = 0 ; i < list.getLength() ; i ++){
                ele = (Element) list.item(i);
                person = new Person();
                person.id = Integer.parseInt(ele.getAttribute("id"));
                person.name = getSubElementTextContent(ele,"name");
                person.age = Integer.parseInt(getSubElementTextContent(ele,"age"));
                persons.add(person);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }

    /**
     * 得到指定的资源中中间的文本内容
     */
    private String getSubElementTextContent(Element ele, String tagName) {
        NodeList list = ele.getElementsByTagName(tagName);
        Element e = (Element) list.item(0);
        //得到中间的文本节点
        return e.getTextContent();
    }

}
复制代码

3.pull方式

复制代码
/**
 * pull解析,拉模式,可以手动控制下一个事件是否触发.
 */
public class PullParse{

    public List<Person> doParse(InputStream is) {
        List<Person> persons = null ;
        Person person = null ;
        try {
            XmlPullParser parser = Xml.newPullParser();
            //设置解析数据源
            parser.setInput(is, "utf-8");
            //取得事件的类型
            int eventType = parser.getEventType();
            String eleName = null ;
            while(eventType != XmlPullParser.END_DOCUMENT){
                switch(eventType){
                    //文档开始
                    case XmlPullParser.START_DOCUMENT:
                        persons = new ArrayList<Person>();
                        break ;
                    //元素开始
                    case XmlPullParser.START_TAG:
                        eleName = parser.getName();
                        if("person".equals(eleName)){
                            person = new Person();
                            person.id = Integer.parseInt(parser.getAttributeValue(0));
                        }
                        else if("name".equals(eleName)){
                            person.name = parser.nextText();
                        }
                        else if("age".equals(eleName)){
                            person.age = Integer.parseInt(parser.nextText());
                        }
                        break ;
                    //标记结束
                    case XmlPullParser.END_TAG:
                        eleName = parser.getName();
                        if("person".equals(eleName)){
                            persons.add(person);
                        }
                        break ;
                }
                //手动激活下个事件的触发
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }

}
复制代码

移动开发qq群:59516399

csdn下载链接:http://download.csdn.net/detail/wenwei19861106/4975192

posted on 2013-01-09 16:53  南瓜饼  阅读(1071)  评论(0编辑  收藏  举报

导航