android 解析XML最常用的三种方式;DOM解析,SAX解析,PULL解析

这里写图片描述

一、使用DOM解析XML

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

二、使用SAX解析XML

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

三、使用Pull解析XML

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

四、DOM、SAX、Pull的比较:

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

真机效果图:

这里写图片描述

要解析的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="111">
        <name>小路</name>
        <age>11</age>

    </person>
    <person id="112">
        <name>小鹿</name>
        <age>12</age>

    </person>
    <person id="113">
        <name>小陆</name>
        <age>13</age>

    </person>
    <person id="114">
        <name>小卢</name>
        <age>14</age>

    </person>
</persons>

首先在manifests里面加一个网络权限

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

java代码:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity {

    private String loName;
    List<String> listid=new ArrayList<>();
    List<String> listname=new ArrayList<>();
    List<String> listage=new ArrayList<>();
    private ListView lv_mian_view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_mian_view = (ListView) findViewById(R.id.lv_mian_view);


         }


    public void parserxml(View view) {
        new MyTask().execute();

    }

    class MyTask extends AsyncTask {
        @Override
        protected Object doInBackground(Object[] params) {
            //1.获取网路XML数据
            //2.原生态层
            //3.URLConnection
            try {
                URL url = new URL("http://192.168.191.3:8080/parseXML.xml");

                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                   //设置请求的方式
                 httpURLConnection.setRequestMethod("GET");
                    //设置请求连接超时的时间(优化)
                   httpURLConnection.setConnectTimeout(5000);
                    //获取结果码
                    int code=httpURLConnection.getResponseCode();

                    if(code==200){
                        //获取服务器返回过来的结果 用流的方式接收
                        InputStream is=httpURLConnection.getInputStream();

                        //解析XML
                        //01.使用DOM解析
//                        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
//                        DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
//                        Document document= documentBuilder.parse(is);
//                        //获取跟标签
//                        Element root= document.getDocumentElement();
//                        //获取跟标签下面的所有标签xxx
//                         NodeList nodeList= root.getElementsByTagName("person");
//                        for (int i = 0; i <nodeList.getLength() ; i++) {
//                            //获取单个
//                            Element personElement= (Element)  nodeList.item(i);
//                            //获取《person》属性id的值
//                            String id=personElement.getAttribute("id");
//                            //获取<person>下面的子标签<name><age><image>的值
//                            Element nameElement= (Element)  personElement.getElementsByTagName("name").item(0);
//                            nameElement.getTextContent();
//                            Element ageElement= (Element)  personElement.getElementsByTagName("age").item(0);
//                            nameElement.getTextContent();
//                        }


                        //02 SAX(边读边解析,基于事件(方法)驱动方式)
//                        SAXParserFactory   saxParserFactory=SAXParserFactory.newInstance();
//                        SAXParser saxParser= saxParserFactory.newSAXParser();
//                        saxParser.parse(is,new DefaultHandler(){
//                            @Override
//                            public void startDocument() throws SAXException {
//                                super.startDocument();
//                            }
//                            @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);
//                               // 获取开始标签的名字
//                                loName = localName;
//                                if("person".equals(localName)){
//                                    //取属性的值
//                                   String id= attributes.getValue(0);
//                                }
//                            }
//                            @Override
//                            public void endElement(String uri, String localName, String qName) throws SAXException {
//                                super.endElement(uri, localName, qName);
//                                loName=null;
//                            }
//                            @Override
//                            public void characters(char[] ch, int start, int length) throws SAXException {
//                                super.characters(ch, start, length);
//                                if("name".equals(loName)){
                                //获取<name>的值
//                                String name=new String(ch,start,length);
//                            }else if("age".equals(loName)){
//                                //获取<name>的值
//                                String age=new String(ch,start,length);
//                            }
//                        }
//                        });




                        //03.pull解析XML
                        XmlPullParser xmlPullParser= Xml.newPullParser();
                        xmlPullParser.setInput(is,"UTF-8");
                        //获取解析的标签的类型
                       int type=xmlPullParser.getEventType();
                        while(type!=XmlPullParser.END_DOCUMENT){
                            //END_DOCUMENT 最后结束
                            switch (type){
                                case XmlPullParser.START_TAG:
                                    //开始获取标签的名字
                                String  startName=xmlPullParser.getName();
                                    if("person".equals(startName)){
                                        //获取id的值
                                        String id=xmlPullParser.getAttributeValue(0);
                                         listid.add(id);
                                    }else if("name".equals(startName)){
                                     String   name = xmlPullParser.nextText();
                                      listname.add(name);
                                    }else if("age".equals(startName)){
                                        String  age = xmlPullParser.nextText();
                                         listage.add(age);
                                    }
                                    break;
                                case XmlPullParser.END_TAG:
                                    break;
                            }
                            //细节:
                            type=xmlPullParser.next();
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                catch (XmlPullParserException e) {
                    e.printStackTrace();
                }
//                catch (ParserConfigurationException e) {
//                    e.printStackTrace();
//                } catch (SAXException e) {
//                    e.printStackTrace();
//                }
//                catch (ParserConfigurationException e) {
//                    e.printStackTrace();
//                } catch (SAXException e) {
//                    e.printStackTrace();
//                }

            return null;
        }


        @Override
        protected void onPostExecute(Object o) {
            //该方法主要是做数据的页面展示
            List<Map<String,Object>> date=new ArrayList<>();
            for (int i = 0; i <listid.size() ; i++) {
                Map<String,Object> map=new HashMap<>();
                map.put("id",listid.get(i));
                map.put("name",listname.get(i));
                map.put("age",listage.get(i));
                date.add(map);
            }
            SimpleAdapter adpater=new SimpleAdapter(getBaseContext(),date,R.layout.item_list,new String[]{"id","name","age"},new int[]{R.id.tv_list_id,R.id.tv_list_name,R.id.tv_list_age});
            lv_mian_view.setAdapter(adpater);
            super.onPreExecute();
        }
    }


}

xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.mdf_android01.android29_parserxml.MainActivity">

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="解析XML"
        android:onClick="parserxml"
        />


    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_mian_view"
        >



    </ListView>
</LinearLayout>
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值