您的位置:首页 > 移动开发 > Android开发

android之PULL解析XML(使用SSH框架服务端生成XML)

2017-02-24 23:44 513 查看
今天我们一起通过一个底层原理的小例子来学习一下使用PULL解析器解析XML文件

下面是一些实现功能的效果如图:



(1)首先要是服务端生成XMl先写一个jsp页面

<a href="personActionaddperson.action">查询</a>


写一个实体类Person类

package com.lin.entity;

public class Person {
private int pid;
private String pname;
private int page;

public Person() {
super();
}
public Person(String pname, int page) {
super();

this.pname = pname;
this.page = page;
}

public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}

@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page + "]";
}

}


然后文件的struts配置文件要配置好

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="myPackage" extends="struts-default">
<action name="personAction*" class="mypersonAction" method="{1}">
<result name="success">/login.jsp</result>
</action>

</package>
</struts>


从数据库里面查数据展示生成xml

public String addperson()  {
List<Person> person=personBiz.getperson();
request.setAttribute("persons", person);
return "success";
}


生成xml文件展示数据库的数据

<?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"%>
<persons><c:forEach items="${persons}" var="p">
<person name="${p.pid}">
<pname>${p.pname}</pname>
<page>${p.page}</page>
</person>
</c:forEach>
</persons>


生成的xml文件如图所示:



上面是使用SSH框架服务端生成XML接下来是使用Pull解析xml文件数据展示到android上效果如图所示:



(2)我这里是个简单的布局文件

<?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.example.android_parsexml.MainActivity">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:onClick="submit"
/>
<ListView
caf0
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_main_listview"
>
</ListView>
</LinearLayout>


接下来是MainActivity的文件

package com.example.android_parsexml;

import android.app.ProgressDialog;
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.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import org.xmlpull.v1.XmlPullParser;

import java.io.BufferedReader;
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<Person> PersonList=new ArrayList<>();
private ListView tv_main_listview;
private ProgressDialog progressDialog;
private Myadater myadater;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化进度条对话框
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("拼命加载中......");

tv_main_listview = (ListView) findViewById(R.id.tv_main_listview);
//实例化适配器
myadater = new Myadater();
tv_main_listview.setAdapter(myadater);

}

class Myadater extends BaseAdapter{

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

@Override
public Object getItem(int i) {
return PersonList.get(i);
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LinearLayout layout=new LinearLayout(MainActivity.this);
layout.setOrientation(LinearLayout.HORIZONTAL);

TextView textViewpid=new TextView(MainActivity.this);
textViewpid.setText(PersonList.get(i).getPid()+"");

TextView textViewName=new TextView(MainActivity.this);
textViewName.setText(PersonList.get(i).getPname());

TextView textViewsex=new TextView(MainActivity.this);
textViewsex.setText(PersonList.get(i).getPage()+"");
layout.addView(textViewpid);
layout.addView(textViewName);
layout.addView(textViewsex);
return layout;
}
}

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

class MyTask extends AsyncTask{

private Person person;

@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();

}

@Override
protected Object doInBackground(Object[] objects) {
//获取网络数据XML
//01.确定网络路径http://localhost:8080/mySSH/personActionadd.action
String path="http://192.168.23.1:8080/mySSH/personActionaddperson.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){
//07.获取服务器返回过来的数据
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 xpp= Xml.newPullParser();
xpp.setInput(is,"UTF-8");
int type=xpp.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取开始标签的名字
String startTagName=xpp.getName();
Log.i("test",""+"startTagName"+startTagName);
if("person".equals(startTagName)){
person = new Person();
//获取name属性值
int pid=Integer.parseInt(xpp.getAttributeValue(0));
Log.i("test",""+pid);
person.setPid(pid);
}else if("pname".equals(startTagName)){
//获取sex的文本值
String pname=xpp.nextText();
Log.i("test",""+pname);
person.setPname(pname);
}else if("page".equals(startTagName)){
//获取sex的文本值
int page=Integer.parseInt(xpp.nextText());
Log.i("test",""+page);
person.setPage(page);
}
break;
case XmlPullParser.END_TAG:
//获取到结束标签的名字
String endTagName=xpp.getName();
Log.i("test",""+endTagName);
if("person".equals(endTagName)){
PersonList.add(person);
}
break;
}
type=xpp.next();
}
}
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
//通知适配器发生改变
myadater.notifyDataSetChanged();
progressDialog.cancel();

}
}

}


最后在清单文件加上网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架 ssh android xml