安卓获取服务器的数据分为两种形式,一种为xml,一种为json.这两种形式都需要通过解析才能获得数据,今天就分享一下xml的解析。博主写了一个小demo。从java服务器中获取数据并展示在移动端。由于一些问题,不能放效果图,不过主页面也就是一个Button,通过Button点击事件获取数据。接下来贴的是服务器的代码。实体类就不贴了,直接贴方法吧!因为是个简单的demo,数据就是模拟的。
java代码:
@RequestMapping("getdata.xhtml")
public String getxml(HttpServletRequest req){
//获取数据 调用数据库查询数据,返回数据集合
//list为有序 set为无序
List<Friendring> fr=new ArrayList<Friendring>();
//遍历数据:
for (int i = 0;i< 10; i++) {
//得到时间
Calendar calendar=Calendar.getInstance();
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH);
int day=calendar.get(Calendar.DAY_OF_MONTH);
fr.add(new Friendring("cat"+i,"very cut",year+"-"+month+"-"+day));
}
// 将对象集合存放到请求域中
req.setAttribute("fr",fr);
return "showdata";
}
其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"%><fqs><c:forEach items="${fr}" var="fr">
<fq name="${fr.name}">
<content>${fr.content}</content>
<time>${fr.time}</time>
</fq>
</c:forEach>
</fqs>
接下来就是移动端接受数据了,但他们之间要想实现连接呢!先需要搭个局域网。至于局域网怎么搭呢?就是你的服务端要与移动端连接同一个网,也就是同一个ip地址,可以好好百度一下,就不说这么多了。接下来贴的是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: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.an_parsexml.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取XML"
android:onClick="getXML"
/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_main_list"
>
</ListView>
</LinearLayout>
其对应的activity:
package com.example.an_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.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
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;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
private ListView lv_main_list;
private List<Friendring> lists=new ArrayList<>();
private Myadapter myadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main_list = (ListView) findViewById(R.id.lv_main_list);
myadapter = new Myadapter();
lv_main_list.setAdapter(myadapter);
Log.i("test","ccccc");
//加载进度
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("玩命加载中");
}
class Myadapter extends BaseAdapter{
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return lists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null){
convertView= getLayoutInflater().from(MainActivity.this).inflate(R.layout.item_listview,null);
Itemtag itemtag=new Itemtag();
itemtag.tv_name= (TextView) convertView.findViewById(R.id.tv_item_listview_name);
itemtag.tv_content= (TextView) convertView.findViewById(R.id.tv_item_listview_content);
itemtag.tv_time= (TextView) convertView.findViewById(R.id.tv_item_listview_time);
// Log.i("test","bbbbbbbb");
convertView.setTag(itemtag);
}
Itemtag itemtag= (Itemtag) convertView.getTag();
itemtag.tv_name.setText(lists.get(position).getName());
itemtag.tv_content.setText(lists.get(position).getContent());
itemtag.tv_time.setText(lists.get(position).getTime());
// Log.i("test","aaaaaaaaa");
return convertView;
}
}
public void getXML(View view){
new Mytask().execute();
}
//拿数据(网络)
class Mytask extends AsyncTask{
//获取前
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected Object doInBackground(Object[] params) {
List<Friendring> fd=new ArrayList<>();
//获取网络数据
//1,获取网络数据的路径
String path="http://192.168.253.10:8090/front/getdata.xhtml";
//2 实例化url
try {
URL url=new URL(path);
//3 获取连接对象(也就是正式建立连接)
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//4,设置请求方式
connection.setRequestMethod("GET");
//5 设置请求超时的时间
connection.setConnectTimeout(5000);
//6 判断是否能拿到数据 获取响应码
int code=connection.getResponseCode();
if(code==200){
// 7 获取返回过来的数据(xml)
//返回数据 通过流的方式拿
InputStream is= connection.getInputStream();
//测试 是否拿到数据
//读取出来 用缓冲字符流 把字节转成字符
// String str=null;
// BufferedReader br=new BufferedReader(new InputStreamReader(is));
// while ((str=br.readLine())!=null){
// Log.i("test",str);
// }
//解析 方式:dom sax pull
//其一 DOM解析 一次性解析完
try {
//通过工厂
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
//得到流
Document document= documentBuilder.parse(is);
//开始解析 获得跟标签
Element root=document.getDocumentElement();
// Log.i("test","获得跟标签");
//node Element区别:node 包含所有 比如空格 Element只包含标签
//获得节点名 子标签
NodeList nodeList= root.getElementsByTagName("fq");
//遍历
for (int i = 0; i <nodeList.getLength() ; i++) {
//获取下面的子标签
Element elment= (Element) nodeList.item(i);
//获取属性name
String name=elment.getAttribute("name");
Log.i("test",name);
//获取子标签
Element elmentcontent= (Element) elment.getElementsByTagName("content").item(0);
//得到文本内容:
String content= elmentcontent.getTextContent();
Element elementtime= (Element) elment.getElementsByTagName("time").item(0);
//得到文本内容:
String time= elementtime.getTextContent();
Log.i("test",name+content+""+time);
//将其加到集合
Friendring friendring=new Friendring(name,content,time);
fd.add(friendring);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
} catch (java.io.IOException e) {
e.printStackTrace();
}
return fd;
}
//更新页面
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
List<Friendring> fd= (List<Friendring>) o;
//把数据加入到适配器当中
lists.addAll(fd);
//通知适配器发生改变
myadapter.notifyDataSetChanged();
progressDialog.cancel();
// Log.i("test","dddddd");
}
}
}
展示数据xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_name" />
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_content" />
<TextView
android:text="TextView"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_item_listview_time" />
</LinearLayout>
实体类那些就不贴了,别忘了配置联网权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>