Android pull方式解析xml文件
今天我们将学习一下通过pull方式解析xml文件的方法
首先,我们需要准备好一个xml文件,xml文件方面的知识我就不多说了,下面时我准备的xml文件的内容,当然你也可以自己准备一个
<?xml version="1.0" encoding="utf-8"?>
<begin>
<student>
<id>001</id>
<name>aaa</name>
<grade>90</grade>
</student>
<student>
<id>002</id>
<name>bbb</name>
<grade>91</grade>
</student>
<student>
<id>003</id>
<name>ccc</name>
<grade>92</grade>
</student>
<student>
<id>004</id>
<name>ddd</name>
<grade>93</grade>
</student>
</begin>
另外我们需要搭建一个Web服务器,而我选择使用的时Tomcat,你也可以使用其他的服务器。
先将准备好的xml文件放在tomcat/webapps/ROOT下面,然后我们在浏览器中输入xml文件的地址,检查下是否能正确打开
image.png
可以看到,确实是没有问题,接下来我们就要进行编写代码了
首先对布局文件没有要求,因为我是让其结果显示在logcat里面的
下面是运行结果
image.png
我使用的是OkHttp工具从服务器获取到xml文件的内容的
https://github.com/square/okhttp
这是OkHttp工具的下载网址,具体用法我就不多说了。
首先我们先使用OkHttp工具从服务器获取xml文件内容
OkHttpClient client=new OkHttpClient();
String url="http://*.*.*.*:*/testPull.xml";
Request request=new Request.Builder().url(url).build();
Response response=client.newCall(request).execute();
String s=response.body().string();
值得注意的是,上面url内的地址:...是指的ip地址,由于我们搭建的服务器的服务端是本机,客户端也是本机,所以ip地址填写本机的ip地址就行。还不知道本机ip地址的话就打开命令行,输入ipconfig查看一下把。
而冒号后面的那个*是指我的tomcat的端口号,输入自己的端口号就好了
注意,从服务器获取内容属于耗时操作,所以别忘了在子线程中进行
这里我们已经获取到了xml文件的内容,并将内容赋值给了s,接下来我们就要对s里面的内容进行处理了
我们解析xml文件需要用到的工具就是XmlPullParser,但是这个工具不能直接new出来,所以我们先要定义一个XmlPullParserFactory这样的一个工厂,让其为我们生产一个XmlPullParser出来,具体代码如下:
XmlPullParserFactor factor=XmlPullParserFactor.new Instance();
XmlPullParser parser=factor.newPullParser();
好了,工具我们已经建好了,接下来就要使用工具了。
首先我们要先给parser里面添加进内容:
parser.setInput(new StringReader(s));
然后我们在定义如下4个属性:
String id,name,grade;
int type;
前三个应该不用我多说什么,就是放每一个学生的属性。
type的作用就是用来存放获取到的内容的类型
首先我们为type赋上值:
type=parser.getEventType();
赋上值以后我们就要根据type的类型来进行判断,从而进行不同的操作了:
Log.d("result","id--name--grade");
while(type!=XmlPullParser.END_DOCUMENT){
String nodeName=parser.getName();
switch(type){
case XmlPullParser.START_TAG:
if(nodeName.equals("id"){
id=parser.nextText();
}else if(nodeName.equals("name"){
name=parser.nextText();
}else if(nodeName.equals("grade"){
grade=parser.nextText();
}
break;
case XmlPullParser.END_TAG){
if(nodeName.equals("student"){
Log.d(“result",id+"--"+name+"--"+grade);
}
}
}
type=parser.next();
}
好了这样就完工了,下面附上完整代码:
public class MainActivity extends AppCompatActivity {
private List<Student> list=new ArrayList<Student>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
f1();
}
private void f1(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient();
String url="http://10.12.62.242:8099/testPull.xml";
Log.d("haha",url);
Request request=new Request.Builder().url(url).build();
Response response=client.newCall(request).execute();
String s=response.body().string();
f2(s);
} catch (IOException e) {
Log.d("haha",e.getMessage());
e.printStackTrace();
}
}
}).start();
}
private void f2(String s) {
Log.d("ss2:",s);
try {
XmlPullParserFactory factor=XmlPullParserFactory.newInstance();
XmlPullParser parser=factor.newPullParser();
parser.setInput(new StringReader(s));
String id=null,name=null,grade=null;
int type=parser.getEventType();
Log.d("result","id--name--grade");
while(type!=XmlPullParser.END_DOCUMENT) {
String nodeName=parser.getName();
switch (type) {
case XmlPullParser.START_TAG:
if (nodeName.equals("id")) {
id = parser.nextText();
} else if (nodeName.equals("name")) {
name = parser.nextText();
} else if (nodeName.equals("grade")) {
grade = parser.nextText();
}
break;
case XmlPullParser.END_TAG:
if (nodeName.equals("student")) {
Log.d("result",id+"--"+name+"--"+grade);
}
break;
default:
break;
}
type=parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
今天的学习就到此为止了,谢谢大家!