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>