zoukankan      html  css  js  c++  java
  • 详解android解析Xml的三种方式——DOM、SAX以及XMLpull

    今天学习了android解析Xml的三种方式——DOM、SAX以及XMLpull,这里对它们进行总结。

    如果理解有误,欢迎指正   ^_*

    一、DOM方式解析:

    xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机。

    常用的DoM接口和类:

    Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。
    Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。
    Node:该接口提供处理并获取节点和子节点值的方法。
    NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。
    DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。

    二、SAX解析技术:

    SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

    常用的接口和类:

    Attrbutes:用于得到属性的个数、名字和值。
    DefaultHandler:它提供了这些接LI的缺省实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法

    三、XMLPull

    XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText0从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument
    事件。

    常用的接口和类:

    XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。
    XmlSerializer:它是一个接口,定义了XML信息集的序列。
    XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

    以下是源码:

    写了一个解析接口然后分别用三个类来实现。当然还可以写成工具类的方式。

    MainActivity:

    package cn.yj3g.TL23_xml_test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.ListActivity;
    import android.content.res.AssetManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.SimpleAdapter;
    import cn.yj3g.entity.Person;
    import cn.yj3g.service2.DomParseService;
    import cn.yj3g.service2.PullParseService;
    import cn.yj3g.service2.SAXParseService;
    
    public class TL23_xml_testActivity extends ListActivity implements
            OnClickListener
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            findViewById(R.id.btn_dom).setOnClickListener(this);
            findViewById(R.id.btn_sax).setOnClickListener(this);
            findViewById(R.id.btn_pull).setOnClickListener(this);
        }
    
        public void onClick(View v)
        {
            int id = v.getId();
            List<Person> list = null;
            InputStream is = null;
            AssetManager manager = getAssets();
            try
            {
                is = manager.open("persons.xml");
            } catch (IOException e)
            {
                e.printStackTrace();
            }
            switch (id)
            {
            case R.id.btn_dom:
                try
                {
                    list = new DomParseService().getPersonsByParseXml(is);
                    showUI(list);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                break;
            case R.id.btn_sax:
                try
                {
                    list = new SAXParseService().getPersonsByParseXml(is);
                    showUI(list);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                break;
            case R.id.btn_pull:
                try
                {
                    Log.v("TAG", "btn_pull");
                    list = new PullParseService().getPersonsByParseXml(is);
                    showUI(list);
                    Log.v("TAG", list.size() + "");
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                break;
            default:
                break;
            }
            try
            {
    
                is.close();
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public void showUI(List<Person> list)
        {
            List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
            for (Person p : list)
            {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("id", p.getId());
                map.put("name", p.getName());
                map.put("age", p.getAge());
                data.add(map);
            }
            String[] from =
            { "id", "name", "age" };
            int[] to =
            { R.id.tv_id, R.id.tv_name, R.id.tv_age };
            SimpleAdapter adapter = new SimpleAdapter(this, data,
                    R.layout.person_list_item, from, to);
            setListAdapter(adapter);
        }
    }

    接口:

    package cn.yj3g.service2;
    
    import java.io.InputStream;
    import java.util.List;
    
    import cn.yj3g.entity.Person;
    
    public interface IXmlParseService {
    
        public List<Person> getPersonsByParseXml(InputStream is) throws Exception;
    }

    DOM实现类:

    package cn.yj3g.service2;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import cn.yj3g.entity.Person;
    
    public class DomParseService implements IXmlParseService
    {
    
        @Override
        public List<Person> getPersonsByParseXml(InputStream is) throws Exception
        {
            List<Person> list = null;
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(is);
            Element rootElement = document.getDocumentElement();
            NodeList nodeList = rootElement.getElementsByTagName("person");// 得到person节点链表
            if (nodeList == null || nodeList.getLength() == 0)
            {
                return null;
            }
            list = new ArrayList<Person>();
            for (int i = 0; i < nodeList.getLength(); i++)
            {
                Person person = new Person();
                Element element = (Element) nodeList.item(i);
    
                // 得到根节点属性:id
                int id = Integer.parseInt(element.getAttribute("id"));
                person.setId(id);
    
                // 得到孩子节点:name
                NodeList nameList = element.getElementsByTagName("name");
                Element nameElement = (Element) nameList.item(0);
                String name = nameElement.getTextContent();
                person.setName(name);
    
                // 得到年龄:age
                NodeList ageList = element.getElementsByTagName("age");
                Element ageElement = (Element) ageList.item(0);
                String age = ageElement.getTextContent();
                person.setAge(Integer.parseInt(age));
    
                list.add(person);
    
            }
    
            return list;
        }
    }

    SAX实现类:

    package cn.yj3g.service2;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import cn.yj3g.entity.Person;
    
    public class SAXParseService implements IXmlParseService
    {
    
        public List<Person> getPersonsByParseXml(InputStream is) throws Exception
        {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            MyHandler handler = new MyHandler();
            parser.parse(is, handler);
            return handler.getList();
        }
    
        private class MyHandler extends DefaultHandler
        {
            private List<Person> list;
            private Person person;
            private String currentTag;
    
            private List<Person> getList()
            {
                return list;
            }
    
            @Override
            public void startDocument() throws SAXException
            {
                list = new ArrayList<Person>();
            }
    
            @Override
            public void endDocument() throws SAXException
            {
                super.endDocument();
            }
    
            @Override
            public void startElement(String uri, String localName, String qName,
                    Attributes attributes) throws SAXException
            {
                if ("person".equals(qName))
                {
                    person = new Person();
                    person.setId(Integer.parseInt(attributes.getValue("id")));
                } else if ("name".equals(qName) || "age".equals(qName))
                {
                    currentTag = qName;
                }
            }
    
            @Override
            public void characters(char[] ch, int start, int length)
                    throws SAXException
            {
                super.characters(ch, start, length);
                String s = new String(ch, start, length);
                if ("name".equals(currentTag))
                {
                    person.setName(s);
                } else if ("age".equals(currentTag))
                {
                    person.setId(Integer.parseInt(s));
                }
                currentTag = null;
            }
    
            @Override
            public void endElement(String uri, String localName, String qName)
            {
                if ("person".equals(qName))
                {
                    list.add(person);
                    person = null;
                }
    
            }
    
        }
    
    }

    Pull实现类:

    package cn.yj3g.service2;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserFactory;
    
    import android.util.Log;
    import cn.yj3g.entity.Person;
    
    public class PullParseService implements IXmlParseService
    {
    
        public List<Person> getPersonsByParseXml(InputStream is) throws Exception
        {
    
            List<Person> list = null;
            Person person = null;
            String currentTag = null;
    
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(is, "utf-8");
            int type = parser.getEventType();
            while (type != XmlPullParser.END_DOCUMENT)
            {
                String typeName = parser.getName();
                if (type == XmlPullParser.START_TAG)
                {
                    Log.v("TAG", "typeName=" + typeName);
                    if ("persons".equals(typeName))
                    {
                        list = new ArrayList<Person>();
                    } else if ("person".equals(typeName))
                    {
                        person = new Person();
                        int id = Integer.parseInt(parser.getAttributeValue(0));
                        person.setId(id);
                    } else if ("name".equals(typeName))
                    {
                        currentTag = "name";
                    } else if ("age".equals(typeName))
                    {
                        currentTag = "age";
                    }
                } else if (type == XmlPullParser.END_TAG)
                {
                    if ("person".equals(typeName))
                    {
                        list.add(person);
                        person = null;
                    }
                } else if (type == XmlPullParser.TEXT)
                {
                    String s = parser.getText();
                    if ("name".equals(currentTag))
                    {
                        person.setName(s);
                        currentTag = null;
                    } else if ("age".equals(currentTag))
                    {
                        person.setAge(Integer.parseInt(s));
                        currentTag = null;
                    }
                }
                type = parser.next();
            }
            Log.v("TAG", "size=" + list.size());
            return list;
        }
    }

    Person测试类:

    package cn.yj3g.entity;
    
    public class Person {
    
        private int id;
        private String name;
        private int age;
    
        public Person(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public Person() {
            super();
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
    }

    要读取的Person  XML文件:

    <?xml version="1.0" encoding="utf-8"?>
    <persons>
        <person id="1">
            <name>刘备</name>
            <age>12</age>    
        </person>
        <person id="2">
            <name>关羽</name>
            <age>14</age>    
        </person>
        <person id="3">
            <name>张飞</name>
            <age>15</age>    
        </person>
    </persons>

    附源码下载地址:http://download.csdn.net/detail/badboy1110/3629850

    不要资源分,希望大家能有收获。  ^_*

    如果觉得有帮助,顺手给我个评论~~~~多谢~

  • 相关阅读:
    c语言中sscanf()与sprintf()的使用
    oracle 12c 创建能用navicat 远程登录的帐号
    ubuntu14.0安装 oracle instant client(oracle 12c)
    【转】Xilinx FPGA ChipScope的ICON/ILA/VIO核使用
    ChipScope——ISE软件的抓波形操作
    【转】彻底掌握Quartus——基础篇
    千兆以太网(4):发送——ODDR原语和Wireshark抓包工具
    千兆以太网(3):发送——组建以太网心跳包
    千兆以太网(2):接收——包校验和数据筛选
    千兆以太网(1):接收——RGMII协议和IDDR原语
  • 原文地址:https://www.cnblogs.com/a354823200/p/4054831.html
Copyright © 2011-2022 走看看