什么是XML格式
XML, 可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。
XML百度百科传送门
步骤简介
1)、在服务器的WebContent中新建一个XML文件,存储数据。名为girls.xml。这就是服务器端发送给客户端的XML文件。
<?xml version="1.0" encoding="utf-8"?>
<gilrs>
<girl>
<name>叶良辰</name>
<age>28</age>
<school>北大</school>
</girl>
<girl>
<name>龙傲天</name>
<age>23</age>
<school>清华</school>
</girl>
</gilrs>
2)、新建一个XmlThread.java类继承Thread,用来向服务器请求并下载XML文件,完成相关的XML文件解析操作。
package com.example.http_01;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.LogRecord;
/**
* Created by TonyDandelion on 2015/11/2.
*/
public class XmlThread extends Thread {
private String url;
private TextView textView;
private Handler handler;
public XmlThread(String url,TextView textView,Handler handler){
this.url=url;
this.textView=textView;
this.handler=handler;
}
@Override
public void run() {
URL httpUrl= null;
try {
httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
InputStream in=conn.getInputStream();
//使用Android原生的parser方法来解析XML文件,PULL是Android自带的XML解析器,事件驱动,事件返回的是数值型,就是下面的eventType;
//先创建一个XmlPullParserFactory类的对象名为factory。
//再调用factory的newPullParser方法得到一个XmlPullParser类的对象,起名为parser。
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
parser.setInput(in,"UTF-8");
//通过parser的getEventType方法得到一个整形数据,这是一个事件。存入eventType,标记着读取到了的XML文件位置。
int eventType=parser.getEventType();
//服务器返回的是两个girl的信息,创建一个girl集合来存储信息。
final List<Girl> list=new ArrayList<Girl>();
Girl girl=null;
//当这个整形数据eventType的值,不等于XmlPullParser.END_DOCUMENT时,说明整个XML文件还没有被读完。执行循环。
while(eventType!=XmlPullParser.END_DOCUMENT){
//通过parser对象的getName方法拿到标签的名字,存到data里面。根据标签名字的不同,用switch进行不同的处理。
String data = parser.getName();
switch (eventType){
//当这个整形数据eventType的值,等于XmlPullParser.START_TAG时,说明到了标签的开始。执行switch判断。
case XmlPullParser.START_TAG:
//当标签的名字是girl时,新建一个Girl对象。
if ("girl".equals(data)) {
girl = new Girl();
}
//当标签的名字是name时,用parser的nextText()方法读取标签内容,调用girl.setName(),设置girl类的name属性。
if("name".equals(data)){
girl.setName(parser.nextText());
}
//当标签的名字是age时,用parser的nextText()方法读取标签内容,注意因为age是整形,所以要用Integer.parseInt强制转换再设置给girl的age。
//调用girl.setName(),设置girl类的name属性。
if("age".equals(data)){
girl.setAge(Integer.parseInt(parser.nextText()));
}
if("school".equals(data)){
girl.setSchool(parser.nextText());
}
break;
//当这个整形数据eventType的值,等于XmlPullParser.END_TAG时,说明已经读取到了到了标签的结束。执行判断。
case XmlPullParser.END_TAG:
//当data为girl且girl不为空的时候,把刚刚那个girl对象存到girl数组里面。
if ("girl".equals(data)&&girl!=null){
list.add(girl);
}
break;
}
//再一次通过parser的getEventType方法得到返回的一个事件。存入eventType,标记着读取到了的XML文件位置。
eventType=parser.next();
}
//通过handler的post来更新主线程IU,就是那个TextView。
handler.post(new Runnable(){
@Override
public void run() {
textView.setText(list.toString());
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}
3)、新建一个Girl.java类,存储相关的标签名字。
package com.example.http_01;
/**
* Created by TonyDandelion on 2015/11/2.
*/
public class Girl {
private int age;
private String school;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写Girl的toString方法
@Override
public String toString() {
return "[name="+name+" age="+age+" scholl]"+school;
}
}
4、新建一个名为my.xml的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="New Text"
android:id="@+id/textView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
5、新建一个XmlActivity.java来关联my.xml,启动XmlThread.java。
package com.example.http_01;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
/**
* Created by TonyDandelion on 2015/11/4.
*/
public class XmlActivity extends Activity{
private TextView textView;
private Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myxml);
textView= (TextView) findViewById(R.id.textView);
String url="http://192.168.1.104:8080/web/girls.xml";
XmlThread thread = new XmlThread(url,textView,handler);
thread .start();
}
}