网络发达的今天,软件市场上99%的app都是需要联网的(最起码你要升级吧,提示,版本号啥的……),那么通讯数据一般由json和xml格式,还有部分可能是数据序列化(最省资源的一种)。
在android里面,解析xml个人比较倾向于DefaultHandler,也是android内置到开发包里面的。说到这里,可以说不少开发者都不知道DefaultHandler正确的用法,而且官方的Demo也是有问题的。在characters函数中,根据public void characters(char[] ch, int start, int length)提供的直接new一直字符串,然后设置到对象中去,大多时候可能是没有问题的。但是有些时候,可能数据格式,长度、空格之类,你会发现,你获取的数据并不完整。那么下面是可以完整获取到数据的实现,我把代码贴出来!
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public abstract class BaseHandler extends DefaultHandler { protected StringBuffer buffer; public BaseHandler() { super(); // TODO Auto-generated constructor stub buffer = new StringBuffer(); } public String getText() { return buffer.toString(); } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); buffer.setLength(0); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); xml(uri, localName, qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); buffer.append(ch, start, length); } public abstract void xml(String uri, String localName, String qName); }
使用的话很简单,继续这个类,会自动重写xml方法,然后通过qName比较对应的tag,通过getText()获取对应tag的内容。
import java.util.ArrayList; import java.util.List; import com.audividi.april.item.MeetItem; public class MeetListHandler extends BaseHandler { private Listlist; public MeetListHandler() { // TODO Auto-generated constructor stub list = new ArrayList(); } public ListgetList() { return list; } @Override public void xml(String uri, String localName, String qName) { // TODO Auto-generated method stub if (qName.equals("ID")) { MeetItem cast = new MeetItem(); cast.setId(getText()); list.add(cast); } else if (qName.equals("CONF_SUBJECT")) { getLast().setConf_subject(getText()); } else if (qName.equals("CONF_CONTENT")) { getLast().setConf_content(getText()); } else if (qName.equals("START_TIME")) { getLast().setStart_time(getText()); } else if (qName.equals("END_TIME")) { getLast().setEnd_time(getText()); } else if (qName.equals("MAX_SPEAKER")) { getLast().setMax_speaker(Integer.parseInt(getText())); } else if (qName.equals("MAX_USER")) { getLast().setMax_user(Integer.parseInt(getText())); } else if (qName.equals("CONF_AV")) { getLast().setConf_av(Integer.parseInt(getText())); } else if (qName.equals("CONF_DISPLAY")) { getLast().setConf_display(getText()); } else if (qName.equals("SIP_NAME")) { getLast().setSip_name(getText()); } else if (qName.equals("ANONYMOUS_ALLOWED")) { getLast().setAnonymous_al(Byte.parseByte(getText()) == 1); } else if (qName.equals("LAST_UPDATE")) { getLast().setLast_update(getText()); } else if (qName.equals("CONF_AVATAR")) { getLast().setConf_avatar(getText()); } else if (qName.equals("CONF_AVATAR_L")) { getLast().setConf_avatar_l(getText()); } else if (qName.equals("CONF_AVATAR_M")) { getLast().setConf_avatar_m(getText()); } else if (qName.equals("CONF_AVATAR_S")) { getLast().setConf_avatar_s(getText()); } else if (qName.equals("CONF_SORT")) { getLast().setConf_sort(Integer.parseInt(getText())); } else if (qName.equals("CONF_VIEW")) { getLast().setConf_view(Integer.parseInt(getText())); } else if (qName.equals("CONF_USERNUMER")) { getLast().setConf_usernumber(Integer.parseInt(getText())); } else if (qName.equals("CONF_STATUS")) { getLast().setConf_status(Integer.parseInt(getText())); } } private MeetItem getLast() { return list.get(list.size() - 1); } }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11412969
每日一句
Move forward to keep life balanced.
人生如骑行,前进即平衡。
人生如骑行,前进即平衡。
Android开源刮刮卡库ScratchCardLayout使用教程
使用VS Code断点调试Vue代码
p2p通信,打洞技术,穿越NAT的实现(附NAT环境检测工具)
NDK19c Clang交叉编译arm64-v8a、armeabi-v7a架构下Boost
Android更新速度越来越快吗?
Vue父组件传对象给子组件
如何精简化Xposed
C++获取Windows 10的版本号
diskgenius 保存分区表时出现错误 代码00000032方法解决
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
快速入门-如何在Java上使用Redis
CreateProcessW要注意的细节问题
关于iOS最常见的15个问题
新会员