Android网络编程里,如果要将web端的数据(也就是Java端)给Android端,Android去接收数据,最常见就有解析xml了,那么今天我们就来讲讲怎样解析xml
我们先在web端里模拟一组数据,并将它发送到请求域当中去,代码如下:(我用的是ssh框架)
public class FQAcgtion extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* XAX
* @return 返回值
* @throws Exception
*
*/
public String getXML() throws Exception {
// 获取数据
// 调用数据库查询数据,返回对象集合(....)
List fqs = new ArrayList();
for (int i = 1; i <= 100; 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);
fqs.add(new FQ("小" + i, "今天心情很nice", year + "-" + month + "-" + day));
}
// 将对象集合存放到请求域中
//ServletActionContext.getRequest().setAttribute("fqs", fqs);
return "dataResult";
}
}
然后我们再来一个XML(dataresult)返回我们模拟的数据
细节注意:上面最好都不要留有空格,不然我们在Android端解析的时候会解析不到数据
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
${fq.content}
web端我们准备好了,现在我们开始在Android端解析数据,我们将数据解析到Android端,并用listview控件展示到我们的手机或者夜神上面:
截图如下:
XML解析数据有三种方式:
main.xml
list_view.xml:
fq.class(里面放的是你的XML标签名,web端和Android端都需要有)
public class FQ {
private String name;
private String content;
private String time;
public FQ() {
super();
}
public FQ(String name, String content, String time) {
super();
this.name = name;
this.content = content;
this.time = time;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
itemtag.class(listview优化)
public class ItemTag {
public TextView tv_name;
public TextView tv_content;
public TextView tv_time;
}
1、DOM模式解析(并不推荐)(getString(R.String.server_name))这里放的是你的Java项目路径以及局域网络域名(如:198.68.34等等),我写在了res/values/Strings.xml里面,这样就可以减少重复代码,而且也不会被别人看到你的项目名以及域名
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog; private ListView lv_main_list; private List 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); progressDialog = new ProgressDialog(this); progressDialog.setMessage("正在拼命loading中..."); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return lists.size(); } @Override public Object getItem(int i) { return lists.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if(view==null){ view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null); ItemTag itemTag=new ItemTag(); itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content); itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name); itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time); view.setTag(itemTag); } ItemTag itemTag= (ItemTag) view.getTag(); itemTag.tv_name.setText(lists.get(i).getName()); itemTag.tv_content.setText(lists.get(i).getContent()); itemTag.tv_time.setText(lists.get(i).getTime()); return view; } } 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[] objects) { List fqs=new ArrayList<>(); //获取网络数据 //01.定义获取网络的数据的路径 String path=getString(R.String.server_name)+"fqActiongetXML.action"; try { //02.实例化Url URL url=new URL(path); //03.获取连接对象 HttpURLConnection conn= (HttpURLConnection) url.openConnection(); //04.设置请求方式 conn.setRequestMethod("GET"); //05.设置请求连接超时的时间 conn.setConnectTimeout(5000); //06.获取响应码 int code=conn.getResponseCode(); if(code==200){ //07.获取返回过来的数据(XML) InputStream is =conn.getInputStream(); //08.测试(删除-注释) //缓冲字符流 String str=null; // BufferedReader br=new BufferedReader(new InputStreamReader(is)); // while((str=br.readLine())!=null){ // Log.i("test",str); // } //09.解析XML //方式:DOM SAX PULL //09.1 使用DOM解析 //设计模式: //单例模式(饿汉 懒汉) try { DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder(); Document document=documentBuilder.parse(is); //获取跟标签 Element root=document.getDocumentElement(); Log.i("test","跟标签:"+root.getTagName()); //Node Element NodeList nodeList=root.getElementsByTagName("fq"); for (int i = 0; i
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
private ListView lv_main_list;
String currentTag=null;
private List 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);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在拼命loading中...");
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int i) {
return lists.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null){
view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null);
ItemTag itemTag=new ItemTag();
itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content);
itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name);
itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time);
view.setTag(itemTag);
}
ItemTag itemTag= (ItemTag) view.getTag();
itemTag.tv_name.setText(lists.get(i).getName());
itemTag.tv_content.setText(lists.get(i).getContent());
itemTag.tv_time.setText(lists.get(i).getTime());
return view;
}
}
public void getXML(View view){
new MyTask().execute();
}
class MyTask extends AsyncTask{
private FQ fq;
private FQ fq1;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected Object doInBackground(Object[] objects) {
final List fqs=new ArrayList<>();
//获取网络数据
//01.定义获取网络的数据的路径
String path=getString(R.string.server_name)+"fqActiongetXML.action";
try {
//02.实例化Url
URL url=new URL(path);
//03.获取连接对象
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//04.设置请求方式
conn.setRequestMethod("GET");
//05.设置请求连接超时的时间
conn.setConnectTimeout(5000);
//06.获取响应码
int code=conn.getResponseCode();
if(code==200){
//07.获取返回过来的数据(XML)
InputStream is =conn.getInputStream();
//08.测试(删除-注释)
//缓冲字符流
String str=null;
// BufferedReader br=new BufferedReader(new InputStreamReader(is));
// while((str=br.readLine())!=null){
// Log.i("test",str);
// }
//09.解析XML
//02.使用SAX解析:特点:边读边解析 基于事件(方法)驱动方式
//开始文档 开始标签 结束标签 结束文档 文本
//张三
// try {
// SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
// SAXParser saxParser=saxParserFactory.newSAXParser();
//
// saxParser.parse(is,new DefaultHandler(){
// @Override
// public void startDocument() throws SAXException {
// super.startDocument();
// }
//
// @Override
// public void endDocument() throws SAXException {
// super.endDocument();
// }
//
// @Override
// public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// super.startElement(uri, localName, qName, attributes);
// currentTag=localName;
// if("fq".equals(localName)){
// //实例化对象
// fq = new FQ();
// String name=attributes.getValue(0);
// fq.setName(name);
// }
//
// }
//
// @Override
// public void endElement(String uri, String localName, String qName) throws SAXException {
// super.endElement(uri, localName, qName);
// //细节:
// currentTag=null;
// if("fq".equals(localName)){
// fqs.add(fq);
// }
// }
//
// @Override
// public void characters(char[] ch, int start, int length) throws SAXException {
// super.characters(ch, start, length);
// if("content".equals(currentTag)){
// String content=new String(ch,start,length);
// fq.setContent(content);
// } else if("time".equals(currentTag)){
// String time=new String(ch,start,length);
// fq.setTime(time);
// }
// }
// });
// } catch (ParserConfigurationException e) {
// e.printStackTrace();
// } catch (SAXException e) {
// e.printStackTrace();
// }
//更新UI
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
List fqs= (List) o;
lists.addAll(fqs);
myAdapter.notifyDataSetChanged();
progressDialog.cancel();
}
}
}
3、PULL解析模式(Android特有的)
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
private ListView lv_main_list;
String currentTag=null;
private List 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);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在拼命loading中...");
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int i) {
return lists.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null){
view=LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview,null);
ItemTag itemTag=new ItemTag();
itemTag.tv_content= (TextView) view.findViewById(R.id.tv_item_listview_content);
itemTag.tv_name= (TextView) view.findViewById(R.id.tv_item_listview_name);
itemTag.tv_time= (TextView) view.findViewById(R.id.tv_item_listview_time);
view.setTag(itemTag);
}
ItemTag itemTag= (ItemTag) view.getTag();
itemTag.tv_name.setText(lists.get(i).getName());
itemTag.tv_content.setText(lists.get(i).getContent());
itemTag.tv_time.setText(lists.get(i).getTime());
return view;
}
}
public void getXML(View view){
new MyTask().execute();
}
class MyTask extends AsyncTask{
private FQ fq;
private FQ fq1;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected Object doInBackground(Object[] objects) {
final List fqs=new ArrayList<>();
//获取网络数据
//01.定义获取网络的数据的路径
String path=getString(R.string.server_name)+"fqActiongetXML.action";
try {
//02.实例化Url
URL url=new URL(path);
//03.获取连接对象
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//04.设置请求方式
conn.setRequestMethod("GET");
//05.设置请求连接超时的时间
conn.setConnectTimeout(5000);
//06.获取响应码
int code=conn.getResponseCode();
if(code==200){
//07.获取返回过来的数据(XML)
InputStream is =conn.getInputStream();
//08.测试(删除-注释)
//缓冲字符流
String str=null;
// BufferedReader br=new BufferedReader(new InputStreamReader(is));
// while((str=br.readLine())!=null){
// Log.i("test",str);
// }
//09.解析XML
try {
//03.使用PULL解析
XmlPullParser pullParser=Xml.newPullParser();
pullParser.setInput(is,"UTF-8");
int type=pullParser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取开始标签的名字
String startTagName=pullParser.getName();
if("fq".equals(startTagName)){
fq1 = new FQ();
String name=pullParser.getAttributeValue(0);
fq1.setName(name);
}else if("content".equals(startTagName)){
String content= pullParser.nextText();
fq1.setContent(content);
}else if("time".equals(startTagName)){
String time= pullParser.nextText();
fq1.setTime(time);
}
break;
case XmlPullParser.END_TAG:
//获取结束标签的名字
String endTagName=pullParser.getName();
if("fq".equals(endTagName)){
fqs.add(fq1);
}
break;
}
type=pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fqs;
}
//更新UI
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
List fqs= (List) o;
lists.addAll(fqs);
myAdapter.notifyDataSetChanged();
progressDialog.cancel();
}
}
}