zoukankan      html  css  js  c++  java
  • Android几种解析XML方式的比较

    https://blog.csdn.net/isee361820238/article/details/52371342

    一、使用SAX解析XML

    SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。 缺点是不能倒退。


    二、使用DOM解析XML

    DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。 缺点是加载大文档时效率低下。


    三、使用Pull解析XML

    Pull内置于Android系统中。也是官方解析布局文件所使用的方式。Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而后在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。


    四、SAX、DOM、Pull的比较:

    • 内存占用:SAX、Pull比DOM要好;
    • 编程方式:SAX采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类XML,就要编写一个新的适合该类XML的处理类。DOM是W3C的规范,Pull简洁。
    • 访问与修改:SAX采用流式解析,DOM随机访问。
    • 访问方式:SAX,Pull解析的方式是同步的,DOM逐字逐句。

    四、各种解析举例

    1、SAX解析举例

    解析代码:

    public class SAXForHandler extends DefaultHandler {
        /**
         * -----------------SAX解析XML----------------------
         */
        private static final String TAG = "SAXForHandler";
        private List<Person> persons;
        private String perTag;// 通过此变量,记录前一个标签的名称
        Person person;// 记录当前Person
        public List<Person> getPersons() {
            return persons;
        }
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            String data = new String(ch, start, length).trim();
            if ( ! "".equals(data.trim())) {
                Log.i(TAG, "content: " + data.trim());
            }
            if ("name".equals(perTag)) {
                person.setName(data);
            }
            else if ("age".equals(perTag)) {
                person.setAge(new Short(data));
            }
            super.characters(ch, start, length);
        }
        @Override
        public void endDocument() throws SAXException {
            Log.i(TAG, "***endDocument()***");
            super.endDocument();
        }
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            Log.i(TAG, qName + "***endElement()***");
            if ("person".equals(localName)) {
                persons.add(person);
                person = null;
            }
            perTag = null;
            super.endElement(uri, localName, qName);
        }
        @Override
        public void startDocument() throws SAXException {
            persons = new ArrayList<Person>();
            Log.i(TAG, "***startDocument()***");
            super.startDocument();
        }
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {//localName标签名,fullName带命名空间的标签名,attribute存放该标签所有属性
            if ("person".equals(localName)) {
                for (int i = 0; i < attributes.getLength(); i++) {
                    Log.i(TAG, "attributeName:" + attributes.getLocalName(i)
                            + "_attribute_Value:" + attributes.getValue(i));
                    person = new Person();
                    person.setId(Integer.valueOf(attributes.getValue(i)));
                    // person.setId(Integer.parseInt(attributes.getValue(i)));
                }
            }
            perTag = localName;
            Log.i(TAG, qName + "***startElement()***");
            super.startElement(uri, localName, qName, attributes);
        }
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    使用SAX解析:

    /**
     * *****************************使用SAX解析XML文件*******************
     * 输入流是指向程序中读入数据
     * @throws Throwable
     */
    public void testSAXGetPersons() throws Throwable {
        InputStream inputStream = this.getClass().getClassLoader()
            .getResourceAsStream("person.xml");
        SAXForHandler saxForHandler = new SAXForHandler();
        /**
         * 用工廠模式解析XML
         */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser saxParser = spf.newSAXParser();
        saxParser.parse(inputStream, saxForHandler);
        // 第二种方式解析XML
        // XMLReader xmlReader = saxParser.getXMLReader();
        // xmlReader.setContentHandler(handler);        
        // xmlReader.parse(new InputSource(inputStream));
        List<Person> persons = saxForHandler.getPersons();
        inputStream.close();
        for (Person person : persons) {
            Log.i(TAG, person.toString());
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2、DOM解析举例

    public class DomPersonService {
        /**
         * @param inStream
         * @return
         * @throws Exception
         */
        public static List<Person> getPersons(InputStream inStream)
                throws Exception {
    
            List<Person> persons = new ArrayList<Person>();
            /**
             * 文檔的解析
             */
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(inStream);
            /**
             * 操作對象樹
             */
            Element root = document.getDocumentElement();//返回文檔的根元素
            NodeList personNodes = root.getElementsByTagName("person");
            for (int i = 0; i < personNodes.getLength(); i++) {
                Element personElement = (Element) personNodes.item(i);
                int id = new Integer(personElement.getAttribute("id"));
                Person person = new Person();
                person.setId(id);
                NodeList childNodes = personElement.getChildNodes();
                for (int y = 0; y < childNodes.getLength(); y++) {
                    if (childNodes.item(y).getNodeType() == Node.ELEMENT_NODE) {
                        if ("name".equals(childNodes.item(y).getNodeName())) {
                            String name = childNodes.item(y).getFirstChild()
                                    .getNodeValue();
                            person.setName(name);
                        }
                        else if ("age".equals(childNodes.item(y).getNodeName())) {
                            String age = childNodes.item(y).getFirstChild()
                                    .getNodeValue();
                            person.setAge(new Short(age));
                        }
                    }
                }
                persons.add(person);
            }
            inStream.close();
            return persons;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    使用DOM解析XML文件

    public void testDOMGetPersons() throws Throwable {
        InputStream inStream = this.getClass().getClassLoader()
            .getResourceAsStream("person.xml");
        List<Person> persons = DomPersonService.getPersons(inStream);
        for (Person person : persons) {
            Log.i(TAG, person.toString());
         }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、PULL解析举例

    public class PullPersonService {
    
        /**
         * ------------------------使用PULL解析XML-----------------------
         * @param inStream
         * @return
         * @throws Exception
         */
        public static List<Person> getPersons(InputStream inStream)
                throws Exception {
            Person person = null;
            List<Person> persons = null;
            XmlPullParser pullParser = Xml.newPullParser();
            pullParser.setInput(inStream, "UTF-8");
            int event = pullParser.getEventType();// 觸發第一個事件
            while (event != XmlPullParser.END_DOCUMENT) {
                switch (event) {
                case XmlPullParser.START_DOCUMENT:
                    persons = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("person".equals(pullParser.getName())) {
                        int id = new Integer(pullParser.getAttributeValue(0));
                        person = new Person();
                        person.setId(id);
                    }
                    if (person != null) {
                        if ("name".equals(pullParser.getName())) {
                            person.setName(pullParser.nextText());
                        }
                        if ("age".equals(pullParser.getName())) {
                            person.setAge(new Short(pullParser.nextText()));
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("person".equals(pullParser.getName())) {
                        persons.add(person);
                        person = null;
                    }
                    break;
                }
                event = pullParser.next();
            }
            return persons;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    PULL解析XML文件

    public void testPullGetPersons() throws Throwable {
        InputStream inStream = this.getClass().getClassLoader()
                .getResourceAsStream("person.xml");
        List<Person> persons = PullPersonService.getPersons(inStream);
        for (Person person : persons) {
            Log.i(TAG, person.toString());
        }
    }
  • 相关阅读:
    linux查找日志技巧
    路径选择算法|Floyd算法|Dijkstras算法(带GUI界面带实验报告)
    待整理
    ClassLoader类加载解惑
    SAX解析xml
    DOM 表单应用
    网站前端优化14条
    用wordpress制作网站的总结
    海豚浏览器前端面试总结
    程序员的美妙生活
  • 原文地址:https://www.cnblogs.com/jukan/p/9487871.html
Copyright © 2011-2022 走看看