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<FQ> fqs = new ArrayList<FQ>();
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端解析的时候会解析不到数据
<?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="${fqs}" var="fq">
<fq name="${fq.name}">
<content>${fq.content}</content>
<time>${fq.time}</time>
</fq>
</c:forEach>
</fqs>
web端我们准备好了,现在我们开始在Android端解析数据,我们将数据解析到Android端,并用listview控件展示到我们的手机或者夜神上面:
截图如下:
XML解析数据有三种方式:
main.xml
<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>
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<FQ> 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<FQ> 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 <nodeList.getLength() ; i++) {
Element element= (Element) nodeList.item(i);
//获取属性name
String name=element.getAttribute("name");
//获取子标签<content><time>
Element elementContent= (Element) element.getElementsByTagName("content").item(0);
String content=elementContent.getTextContent();
Element elementTime= (Element) element.getElementsByTagName("time").item(0);
String time=elementTime.getTextContent();
Log.i("test",name+" "+content+" "+time);
FQ fq=new FQ(name,content,time);
fqs.add(fq);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException 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<FQ> fqs= (List<FQ>) o;
lists.addAll(fqs);
myAdapter.notifyDataSetChanged();
progressDialog.cancel();
}
}
}
2、SAX解析模式
public class MainActivity extends AppCompatActivity {
private ProgressDialog progressDialog;
private ListView lv_main_list;
String currentTag=null;
private List<FQ> 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<FQ> 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解析:特点:边读边解析 基于事件(方法)驱动方式
//开始文档 开始标签 结束标签 结束文档 文本
//<name>张三</name>
// 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<FQ> fqs= (List<FQ>) 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<FQ> 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<FQ> 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<FQ> fqs= (List<FQ>) o;
lists.addAll(fqs);
myAdapter.notifyDataSetChanged();
progressDialog.cancel();
}
}
}