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

今天我们一起通过一个底层原理的小例子来学习一下使用PULL解析器解析XML文件
下面是一些实现功能的效果如图:
SSH整合的:

(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文件如图所示:
这个是XML文件

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

这个是在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
        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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值