关闭

Android几种解析XML方式的比较

标签: android解析
7845人阅读 评论(0) 收藏 举报
分类:

XML介绍:Extensible Markup Language,即可扩展标记语言

一、使用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);
    }

}

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

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

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

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

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());
    }
}
2
3
查看评论

Android基础——XML数据的三种解析方式

Android基础——XML数据的三种解析方式 本篇文章包含以下内容: XML数据的Dom解析 XML数据的Sax解析 XML数据的Pull解析 Activity中使用三种解析 Sax解析与Pull解析区别 三种解析方式的步骤: 在Assets文件夹中模拟创...
  • qq_30379689
  • qq_30379689
  • 2016-11-15 13:36
  • 6903

Android中解析XML

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析...
  • liuhe688
  • liuhe688
  • 2011-05-12 19:32
  • 215646

Android解析XML的三种方式

在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式. 如图: 这里是获取网络XML: DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推...
  • d_shadow
  • d_shadow
  • 2017-02-16 11:28
  • 1187

android之Xml的高效解析方式——pull

我们知道,解析XML在各个平台使用也非常广泛,android也是一样,经常会涉及到XML的解析读取,解析方式主要有三种:SAX解析器、DOM解析器和PULL解析器。 SAX解析器:它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的,也就是ContentHandler为重要核心,解析过...
  • qq_21983189
  • qq_21983189
  • 2017-02-14 12:09
  • 1073

Android之PULL解析XML

今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。 (1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下: 范冰冰 28 ...
  • bear_huangzhen
  • bear_huangzhen
  • 2014-04-29 10:22
  • 25608

Android三种解析XML方式

XML三种解析方式
  • u011310942
  • u011310942
  • 2014-02-18 21:49
  • 3102

Android:解析XML的三种方式

1、首先,在布局文件中写一个Button控件和用来展示数据的ListView控件。 <Button android:layout_width="wrap_content" android:layout_height="wrap_content&q...
  • AbbyDream
  • AbbyDream
  • 2017-02-27 16:01
  • 626

android三种XMl解析

android一共提供了三种XMl解析的方式,分别为:SAX解析,Pull解析,DOM解析。 第一种:SAX解析:  SAX是驱动型的xml解析,对文档进行顺序扫描,当扫描到document开始,元素的开始与结束,文档结束等地方通知相关处理事件处理函数,处理完函数之后继续进行扫...
  • u013209460
  • u013209460
  • 2016-12-07 20:44
  • 627

Android Studio 解析XML的三种方法

一丶概述 文件解析要求,json解析和xml解析,前面文章说过Json转实体类,这里就说说解析XML 内容: Android Studio 解析XML常见的三种方式:DOM PULL SAX (实现XML转实体类并打印输出) 效果演示: 二丶正文 这里不做详细讲解,看注释,上代码 看项目文件,注...
  • DT235201314
  • DT235201314
  • 2017-05-10 21:03
  • 3786

Android中解析XML总结

前言: 1>示例XML文件内容 对示例所演示的是如何解析一个XML文件,对于我们要解析的XML文件,其已经放入本应用的文件夹下了; 对于我们要解析的XML文件,其内容如下: 2>认识XmlPullParser I>解析器的当前事件状态可以通过调用getEventType()...
  • u010661782
  • u010661782
  • 2016-06-27 21:25
  • 683
    个人资料
    • 访问:65104次
    • 积分:996
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:1篇
    • 译文:2篇
    • 评论:6条
    博客专栏
    最新评论