android xml pull 的解析器

          xml的解析分爲是三種,包括:DOM ,SAX ,PULL, PULL解析類似於SAX,都是基於流的操作文件,然後根據節點事件回調開發者的處理程序,因此比較節約內存資源。 pull是android附帶的一個解析器。

   下面我就來做一個pull解析的demo。以eclipse作爲服務器,讓androidstudio來獲取eclipse的數據。

   第一步:我們首先在eclipse中生成xml:

                 小編用了SSH和SSM做測試,至於如何搭建框架,就不說了。先說SSH中的步驟,框架搭好後,建立一個類,裏面寫上你要的屬性,配置好struts.xml,在寫Action包的程序:

        我這裏就沒有從數據庫獲取值了,直接循環了10個數據

public class StudentAction extends ActionSupport{
  
    public String getxml() {
    	System.out.println("12323");
           //查詢數據,獲取數據
    	List<Student> students=new ArrayList<Student>();
    	for (int i = 0; i < 10; i++) {
			Student st=new Student("sara"+i, "女");
			students.add(st);
		}
    
    	//將對象保存到請求域中
    	ServletActionContext.getRequest().setAttribute("students", students);
    	return "dataResult";
    }
  jsp的頁面:

<?xml version="1.0" encoding="UTF-8" ?><%@ page language="java" contentType="text/xml; charset=UTF-8" 
pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<students><c:forEach items="${students}" var="s">
		<student name="${s.sname}">
			<sex>${s.sex}</sex>
		</student>
	</c:forEach>
</students>
	

    把jsp 的html文件改成xml文件,注意一二之間不要空格,因爲空格的也會被解析到。

     在貼出action類裏面的代碼

   

 public String getxml() {
           //查詢數據,獲取數據
    	List<Student> students=new ArrayList<Student>();
    	for (int i = 0; i < 10; i++) {
			Student st=new Student("sara"+i, "女");
			students.add(st);
		}
    
    	//將對象保存到請求域中
    	ServletActionContext.getRequest().setAttribute("students", students);
    	return "dataResult";
    }
  服務器就搭建好了,最後讓手機和電腦處於同一個局域網下,讓手機去獲取eclipse的這一串數據,能獲取到就匹配成功了。

  接下來就是androidStudio做網絡操作了,代碼裏都有註釋:

  

package com.example.mynetdata;

import android.app.ProgressDialog;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

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.List;

public class MainActivity extends AppCompatActivity {
    List<Student> students=new ArrayList<>();
    private ListView lv_main_list;
    private GoogleApiClient client;
    private MyAdpter myAdpter;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //實例化一個進度條的框
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("正在加載中");
        lv_main_list = (ListView) findViewById(R.id.lv_main_list);
        //實例化適配器
        myAdpter = new MyAdpter();

        //通知、設置
        lv_main_list.setAdapter(myAdpter);
    }
    class MyAdpter extends BaseAdapter{

        @Override
        public int getCount() {
            return students.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return  position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LinearLayout linearLayout=new LinearLayout(MainActivity.this);
            linearLayout.setOrientation(LinearLayout.HORIZONTAL);
            TextView textViewname=new TextView(MainActivity.this);
            textViewname.setText(students.get(position).getSname());
            TextView textViewsex=new TextView(MainActivity.this);
            textViewsex.setText(students.get(position).getSex());
            textViewsex.setTextSize(20);
            textViewname.setTextSize(20);
            linearLayout.addView(textViewname);
            linearLayout.addView(textViewsex);
            return linearLayout;
        }
    }

    public void getXML(View view) {
        new Mytask().execute();
    }
    class Mytask extends AsyncTask {
        private Student student;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }
        @Override
        protected Object doInBackground(Object[] params) {
            //獲取網絡數據xml
            //01確定網絡路勁
            String path = "http://192.168.86.109:8080/SSM/getxml.action";
            try{
                //02實例化url
                   URL url = new URL(path);
                //03獲取連接
                    HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                   //04設置請求方式
                  connection.setRequestMethod("GET");
                  //05設置請求連接超時的時間(優化)
                  connection.setConnectTimeout(5000);
                 //06獲取響應碼,結果嗎
                int code= connection.getResponseCode();
                if (code==200){
                    //獲取服務器發過來的數據
                  InputStream is=connection.getInputStream();
                    //測試
                    //緩衝字符流
                /*    BufferedReader br=new BufferedReader(new InputStreamReader(is));
                    String str=null;
                    while((str=br.readLine())!=null){
                        Log.i("test",str);
                    }*/
                    //解析pull,基於事件驅動
                  XmlPullParser xmlPullParser= Xml.newPullParser();
                    try {
                        xmlPullParser.setInput(is,"UTF-8");
                        int type=xmlPullParser.getEventType();
                        while(type!=xmlPullParser.END_DOCUMENT){
                            switch (type){
                                case  XmlPullParser.START_DOCUMENT:
                                    break;
                                case XmlPullParser.START_TAG:
                                    //獲取開始標籤的名字
                                    String startTagName=xmlPullParser.getName();
                                    if ("student".equals(startTagName)){
                                        student = new Student();
                                        //獲取name的屬性值
                                        String name=xmlPullParser.getAttributeValue(0);
                                        Log.i("test",name);
                                        student.setSname(name);
                                    }else if ("sex".equals(startTagName)){
                                        //獲取sex的文本值
                                       String sex= xmlPullParser.nextText();
                                        Log.i("test",sex);
                                        student.setSex(sex);
                                    }
                                  break;
                                case XmlPullParser.END_TAG:
                                    //獲取結束標籤的名字
                                    String endTagName=xmlPullParser.getName();
                                    if ("student".equals(endTagName)){
                                        students.add(student);
                                    }
                                    break;
                             }
                            type=xmlPullParser.next();
                        }
                    } catch (XmlPullParserException e) {
                        e.printStackTrace();
                    }
                }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
               }catch (IOException e){
                 e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            //通知適配器發生改變
            myAdpter.notifyDataSetChanged();
            progressDialog.cancel();
        }
    }
}
最後在到清單文件里加入網絡的權限就可以了:

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

  


       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章