android xml解析 XmlPullParser的使用
16lz
2021-01-24
本文转自:http://samwong.iteye.com/blog/1000403
android xml 的解析.
1.普通型
Xml代码- <?xmlversion=”1.0″?>
- <statuses>
- <status>
- <source1>a</source1>
- <source2>a</source2>
- <source2>a</source2>
- </status>
- <statuses>
- </xml>
- try{
- xpp.setInput(newStringReader(“xmlstring”));
- XmlPullParserparser=XmlPullParserFactory.newInstance()
- .newPullParser();
- inteventType=parser.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- if(eventType==XmlPullParser.START_TAG){
- Stringname=parser.getName();
- Log.v(“tag”,parser.getName()+”=”+parser.next());
- }
- eventType=parser.next();
- }
- }catch(XmlPullParserExceptione){
- }catch(Exceptione){
- }
- <?xmlversion=”1.0″encoding=”UTF-8″standalone=”no”?>
- <statuses>
- <status>
- <source1>a</source1>
- <source2>a</source2>
- <source2>a</source2>
- <user>
- <source1>a</source1>
- <source2>a</source2>
- <source2>a</source2>
- </user>
- </status>
- <status>
- <source1>a</source1>
- <source2>a</source2>
- <source2>a</source2>
- <user>
- <source1>a</source1>
- <source2>a</source2>
- <source2>a</source2>
- </user>
- </status>
- <statuses>
- </xml>
- try{
- XmlPullParserparser=XmlPullParserFactory.newInstance()
- .newPullParser();
- xpp.setInput(newStringReader(xmlstring));
- parser.next();
- parser.require(XmlPullParser.START_TAG,null,“statuses”);
- while(parser.nextTag()!=XmlPullParser.END_TAG){
- parser.require(XmlPullParser.START_TAG,null,“status”);
- for(inti=0;i<3;i++){
- parser.nextTag();
- Log.v(“tag”,parser.getName()+”=”+parser.nextText());
- }
- while(parser.nextTag()!=XmlPullParser.END_TAG){
- parser.require(XmlPullParser.START_TAG,null,“user”);
- while(parser.nextTag()!=XmlPullParser.END_TAG){
- Stringname=parser.getName();
- Stringtext2=parser.nextText();
- Log.v(“tag”,”text2″+text2);
- parser.require(XmlPullParser.END_TAG,null,name);
- }
- parser.require(XmlPullParser.END_TAG,null,“user”);
- }
- parser.require(XmlPullParser.END_TAG,null,“status”);
- }
- parser.require(XmlPullParser.END_TAG,null,“statuses”);
- parser.next();
- parser.require(XmlPullParser.END_DOCUMENT,null,null);
- //global.userinfo.dump();
- }catch(XmlPullParserExceptione){
- }catch(Exceptione){
- }
- for(inti=0;i<3;i++){
- parser.nextTag();
- Log.v(“tag”,parser.getName()+”=”+parser.nextText());
- }
开发过程中遇到 XmlPullParser.netText()方法造成的Bug
解决如下:
在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法 。Android已经在历史上有两个实现这个接口实现类:
-
KXmlParser,通过XmlPullParserFactory.newPullParser()。
-
ExpatPullParser,通过Xml.newPullParser()。
实现Xml.newPullParser()
调用nextText()有个错误,nextText()
并不总是向文档中所提到优先于END_TAG执行
。
因此,一些应用可能会出现bug在额外调用next()或nextTag();
[html] view plain copy
- throwsXmlPullParserException,IOException{
- XmlPullParserparser=Xml.newPullParser();
- parser.setInput(reader);
- parser.nextTag();
- parser.require(XmlPullParser.START_TAG,null,"menu");
- while(parser.nextTag()==XmlPullParser.START_TAG){
- parser.require(XmlPullParser.START_TAG,null,"item");
- StringitemText=parser.nextText();
- parser.nextTag();//thiscallshouldn’tbenecessary!
- parser.require(XmlPullParser.END_TAG,null,"item");
- System.out.println("menuoption:"+itemText);
- }
- parser.require(XmlPullParser.END_TAG,null,"menu");
- }
- publicstaticvoidmain(String[]args)throwsException{
- newMenu().parseXml(newStringReader("<?xmlversion='1.0'?>"
- +"<menu>"
- +"<item>Waffles</item>"
- +"<item>Coffee</item>"
- +"</menu>"));
- }
不幸的是,当前可能会崩溃的应用程序都是低于android4.0版本的,下面是错误信息。
[html] view plain copy
- org.xmlpull.v1.XmlPullParserException:expected:END_TAG{null}item(position:START_TAG<item>@1:37in[email protected])
- atorg.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
- atcom.publicobject.waffles.Menu.parseXml(Menu.java:25)
- atcom.publicobject.waffles.Menu.main(Menu.java:32)
[html] view plain copy
- while(parser.nextTag()==XmlPullParser.START_TAG){
- parser.require(XmlPullParser.START_TAG,null,"item");
- StringitemText=parser.nextText();
- if(parser.getEventType()!=XmlPullParser.END_TAG){
- parser.nextTag();
- }
- parser.require(XmlPullParser.END_TAG,null,"item");
- System.out.println("menuoption:"+itemText);
- }
[html] view plain copy
- privateStringsafeNextText(XmlPullParserparser)
- throwsXmlPullParserException,IOException{
- Stringresult=parser.nextText();
- if(parser.getEventType()!=XmlPullParser.END_TAG){
- parser.nextTag();
- }
- returnresult;
- }
更多相关文章
- android怎么将已经安装在内存上的应用程序移动到SD卡上
- android 动态注册 广播
- android中webView中对HTML的一些操作【更新代码】
- Android(安卓)native 内存泄露检测
- android播放器音量控制-使用震动示例代码-进度条控制音量
- Android(安卓)-- Context
- Android遇到的问题解决方法
- 常用的Android(安卓)Widget组件学习①--Button and TextView
- SQlite数据库(4)---DAO(data access object)数据访问对象