安卓解析xml格式字符串
最近实验室的安卓app需要实现发内部邮件的功能。
说白了就是简单的数据库的增删处理。
但是中间的一部分有意思的就是获取收件人的列表的处理。
用户在登录APP的时候,如果验证成功,服务器则把数据的联系人的所有信息发送回来到客户端。
发送出来的格式是dataset,处理之后转换为xml格式的字符串发出来。
当发邮件的时候 ,则会在收件人提供一个Spinner控件,然后把所有人的名字显示出来。
这个时候就涉及到xml格式的字符串的解析。
我的实现方法很简单。用的是PULL方法。希望能够帮助到需要的同学。
首先看服务器端发回的字符串格式
<span style="font-size:18px;"><NewDataSet><ds><UserName>admin</UserName></ds><ds><UserName>王涵杨</UserName></ds><ds><UserName>陈鹏</UserName></ds><ds><UserName>谢永军</UserName></ds><ds><UserName>陈旻</UserName></ds><ds><UserName>姜川</UserName></ds><ds><UserName>刘渊</UserName></ds><ds><UserName>范玮</UserName></ds><ds><UserName>赵靖</UserName></ds><ds><UserName>黄大为</UserName></ds><ds><UserName>徐兰</UserName></ds><ds><UserName>赵金扎</UserName></ds><ds><UserName>宁云霞</UserName></ds><ds><UserName>贾慧</UserName></ds><ds><UserName>王瑞</UserName></ds><ds><UserName>李春艳</UserName></ds><ds><UserName>李婷</UserName></ds><ds><UserName>康健麒</UserName></ds><ds><UserName>折超颖</UserName></ds><ds><UserName>刘亮</UserName></ds><ds><UserName>庞晓芳</UserName></ds><ds><UserName>邬录</UserName></ds><ds><UserName>邬兆轩</UserName></ds><ds><UserName>石进</UserName></ds><ds><UserName>张振龙</UserName></ds><ds><UserName>王彦军</UserName></ds><ds><UserName>撖泽雨</UserName></ds><ds><UserName>杨杰</UserName></ds><ds><UserName>杜丹</UserName></ds><ds><UserName>赵小燕</UserName></ds><ds><UserName>赵慧</UserName></ds><ds><UserName>鲁星宇</UserName></ds><ds><UserName>田宝凤</UserName></ds><ds><UserName>王玲</UserName></ds><ds><UserName>刘轶群</UserName></ds><ds><UserName>贺艳</UserName></ds><ds><UserName>温晔</UserName></ds><ds><UserName>侯丽枝</UserName></ds><ds><UserName>刘源</UserName></ds><ds><UserName>王庆伟</UserName></ds><ds><UserName>王旭</UserName></ds><ds><UserName>洪雪松</UserName></ds><ds><UserName>张巧平</UserName></ds><ds><UserName>李瑞霞</UserName></ds><ds><UserName>李倩</UserName></ds></NewDataSet></span>
就是数据库中所有人的姓名。
然后客户端接受到这个字符串。同时写入到SharedPreferences中保存。
在发邮件的时候,读取SharedPreferences的姓名,并转换。
读取姓名:
<span style="font-size:18px;">private SharedPreferences info; private String peoInfo; </span>
<span style="font-size:18px;">info = getSharedPreferences("info", 0); peoInfo = info.getString("info","");</span>
<span style="font-size:18px;">ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(peoInfo.getBytes());<span style="white-space:pre"> </span>//转为流 </span>xml字符串处理,首先声明一个接口InfoParse.java:
<span style="font-size:18px;">public interface InfoParse { public ArrayList<String> parse(InputStream is) throws Exception; }</span>返回ArrayList;
接着实现接口PullInfo.java:
<span style="font-size:18px;">public class PullInfo implements InfoParse { ArrayList<String> info = new ArrayList<String>() ; String temp =null; @Override public ArrayList<String> parse(InputStream is)throws Exception { // TODO 自动生成的方法存根 XmlPullParser parser = Xml.newPullParser(); //由android.util.Xml创建一个XmlPullParser实例 parser.setInput(is, "UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: temp = null; break; case XmlPullParser.START_TAG: if (parser.getName().equals("UserName")) { eventType = parser.next(); temp = parser.getText(); } break; case XmlPullParser.END_TAG: if (parser.getName().equals("ds")) { info.add(temp); } break; } eventType = parser.next(); } <span style="white-space:pre"> </span>return info; <span style="white-space:pre"> </span>}</span>
<span style="font-size:18px;">}</span>因为有字符串看出来,只有ds一个标签里的内容需要识别。至于其他的标签,请自行添加判断条件。
最后在发邮件的里面写上
<span style="white-space:pre"><span style="font-size:18px;"> InfoParse parser = null; </span></span>
<pre name="code" class="java"><span><span style="font-size:18px;"> ArrayList<String> peoName = new ArrayList<String>();</span></span>String drp[];
<span style="font-size:18px;"><span style="white-space:pre"> </span>try { parser = new PullInfo(); peoName = parser.parse(tInputStringStream); int size = peoName.size(); drp = new String[size]; for(int i = 0 ;i < size ; i ++) { drp[i] = (String)peoName.get(i); } } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }</span>这样解析之后,都存在字符串数组drp中。
至于绑定,可以参考如下
private Spinner type; private ArrayAdapter<String> adapter; type = (Spinner)findViewById(R.id.type); type.setPadding(15,0,0,0); adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,drp); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); type.setAdapter(adapter); type.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO 自动生成的方法存根 ToUser = drp[arg2]; } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO 自动生成的方法存根 } });效果如下图。
吐槽一句:自学安卓不到1个月的大三狗,没有美工,只有一人做安卓APP、
o(︶︿︶)o 唉~ 将就看吧~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。