Android 网络传输数据之解析XML格式数据(Pull&SAX),三面蚂蚁核心金融部

下面介绍两种常用的两种解析xml格式的数据方式

Pull解析方式

首先创建一个空的Activity,做一个简单的布局,布局代码如下 :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<Button

android:id=“@+id/send_request”

android:layout_height=“wrap_content”

android:layout_width=“match_parent”

android:text=“Send Request”/>

<ScrollView

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<TextView

android:id=“@+id/response_text”

android:layout_width=“match_parent”

android:layout_height=“wrap_content” />

重点在MainActivity,下面给出代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

TextView responseText;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button sendRequest = (Button) findViewById(R.id.send_request);

responseText = (TextView) findViewById(R.id.response_text);

sendRequest.setOnClickListener(this);

}

@Override

public void onClick(View v) {

if(v.getId() == R.id.send_request){

sendRequestWithOjHttp();

}

}

private void sendRequestWithOjHttp(){

//开启线程来发起网络请求

new Thread(new Runnable() {

@Override

public void run() {

HttpURLConnection connection = null;

BufferedReader reader = null;

try{

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url(“http://10.0.2.2:8023/get_data.xml”)

.build();

Response response = client.newCall(request).execute();

String responseData = response.body().string();

paraseXMLWithPull(responseData);

}catch (Exception e){

e.printStackTrace();

}

}

}).start();

}

private void paraseXMLWithPull(String xmlData){

try{

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlPullParser = factory.newPullParser();

xmlPullParser.setInput(new StringReader(xmlData));

int evenType = xmlPullParser.getEventType();

String id=“”;

String name=“”;

String version=“”;

while(evenType != XmlPullParser.END_DOCUMENT){

String nodeName = xmlPullParser.getName();

switch(evenType){

//开始解析某个节点

case XmlPullParser.START_TAG:{

if(“id”.equals(nodeName)){

id = xmlPullParser.nextText();

}else if(“name”.equals(nodeName)){

name = xmlPullParser.nextText();

}else if(“version”.equals(nodeName)){

version = xmlPullParser.nextText();

}

break;

}

case XmlPullParser.END_TAG:{

if(“app”.equals(nodeName)){

Log.d(“MainActivity”,“id is”+id);

Log.d(“MainActivity”,“name is”+name);

Log.d(“MainActivity”,“version is”+version);

}

break;

}

default:

break;

}

evenType = xmlPullParser.next();

}

}catch (Exception e){

e.printStackTrace();

}

}

}

创建request对象发送请求,通过url()方法来设置目标网络地址,这里将HTTP请求的地址改成 http://10.0.0.2:8023/get_data.xml, 10.0.0.2对于模拟器来说就是电脑本机的IP地址。调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器数据。得到服务器返回的数据之后,调用parseXMLWithPull()方法来解析服务器返回的数据。

在parseXMLWithPull()中,首先获取一个XmlPullParserFactory的实例,并借助该实例得到XmlPullParser对象,然后调用XmlPullParser的setInput()方法将服务器返回的XML数据设置进去。之后开始解析,通过getEvenType()可以得到当前的解析事件,然后在一个while循环中不断的进行地解析,如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用next()方法后可以获取下个解析事件。

在while循环中,通过getName()方法得到当前节点的名字,如果发现节点等于id、name或version,就调用nextText()方法来获取节点内具体的内容,每当解析完一个app节点后就获取到的内容就打印出现。

点击send Request按钮

在Logcat中打印的日志如下,可以看到已经将XML数据中的制定内容成功解析出来了。

在这里插入图片描述

SAX解析方式

相对于Pull解析要复杂一些,但是在语义上更容易理解。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

上述【高清技术脑图】以及【配套的架构技术PDF】点击:Android架构视频+BAT面试专题PDF+学习笔记,或者私信回复【技能提升】即可获取!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

上述【高清技术脑图】以及【配套的架构技术PDF】点击:Android架构视频+BAT面试专题PDF+学习笔记,或者私信回复【技能提升】即可获取!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值