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

来源:互联网 发布:java 微信 编辑:程序博客网 时间:2024/05/21 14:54

这里写图片描述

一、使用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>
2 0
原创粉丝点击