本文转自:http://samwong.iteye.com/blog/1000403

android xml 的解析.

1.普通型

Xml代码
  1. <?xmlversion=”1.0″?>
  2. <statuses>
  3. <status>
  4. <source1>a</source1>
  5. <source2>a</source2>
  6. <source2>a</source2>
  7. </status>
  8. <statuses>
  9. </xml>
解析代码. Java代码
  1. try{
  2. xpp.setInput(newStringReader(“xmlstring”));
  3. XmlPullParserparser=XmlPullParserFactory.newInstance()
  4. .newPullParser();
  5. inteventType=parser.getEventType();
  6. while(eventType!=XmlPullParser.END_DOCUMENT){
  7. if(eventType==XmlPullParser.START_TAG){
  8. Stringname=parser.getName();
  9. Log.v(“tag”,parser.getName()+”=”+parser.next());
  10. }
  11. eventType=parser.next();
  12. }
  13. }catch(XmlPullParserExceptione){
  14. }catch(Exceptione){
  15. }
2.嵌套子类. Xml代码
  1. <?xmlversion=”1.0″encoding=”UTF-8″standalone=”no”?>
  2. <statuses>
  3. <status>
  4. <source1>a</source1>
  5. <source2>a</source2>
  6. <source2>a</source2>
  7. <user>
  8. <source1>a</source1>
  9. <source2>a</source2>
  10. <source2>a</source2>
  11. </user>
  12. </status>
  13. <status>
  14. <source1>a</source1>
  15. <source2>a</source2>
  16. <source2>a</source2>
  17. <user>
  18. <source1>a</source1>
  19. <source2>a</source2>
  20. <source2>a</source2>
  21. </user>
  22. </status>
  23. <statuses>
  24. </xml>
解析代码: Java代码
  1. try{
  2. XmlPullParserparser=XmlPullParserFactory.newInstance()
  3. .newPullParser();
  4. xpp.setInput(newStringReader(xmlstring));
  5. parser.next();
  6. parser.require(XmlPullParser.START_TAG,null,“statuses”);
  7. while(parser.nextTag()!=XmlPullParser.END_TAG){
  8. parser.require(XmlPullParser.START_TAG,null,“status”);
  9. for(inti=0;i<3;i++){
  10. parser.nextTag();
  11. Log.v(“tag”,parser.getName()+”=”+parser.nextText());
  12. }
  13. while(parser.nextTag()!=XmlPullParser.END_TAG){
  14. parser.require(XmlPullParser.START_TAG,null,“user”);
  15. while(parser.nextTag()!=XmlPullParser.END_TAG){
  16. Stringname=parser.getName();
  17. Stringtext2=parser.nextText();
  18. Log.v(“tag”,”text2″+text2);
  19. parser.require(XmlPullParser.END_TAG,null,name);
  20. }
  21. parser.require(XmlPullParser.END_TAG,null,“user”);
  22. }
  23. parser.require(XmlPullParser.END_TAG,null,“status”);
  24. }
  25. parser.require(XmlPullParser.END_TAG,null,“statuses”);
  26. parser.next();
  27. parser.require(XmlPullParser.END_DOCUMENT,null,null);
  28. //global.userinfo.dump();
  29. }catch(XmlPullParserExceptione){
  30. }catch(Exceptione){
  31. }
最里面那个可以满足 <user>也是循环. 如果<user>不循环. 可以使用. Java代码
  1. for(inti=0;i<3;i++){
  2. parser.nextTag();
  3. Log.v(“tag”,parser.getName()+”=”+parser.nextText());
  4. }
代替.

开发过程中遇到 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
  1. throwsXmlPullParserException,IOException{
  2. XmlPullParserparser=Xml.newPullParser();
  3. parser.setInput(reader);
  4. parser.nextTag();
  5. parser.require(XmlPullParser.START_TAG,null,"menu");
  6. while(parser.nextTag()==XmlPullParser.START_TAG){
  7. parser.require(XmlPullParser.START_TAG,null,"item");
  8. StringitemText=parser.nextText();
  9. parser.nextTag();//thiscallshouldn’tbenecessary!
  10. parser.require(XmlPullParser.END_TAG,null,"item");
  11. System.out.println("menuoption:"+itemText);
  12. }
  13. parser.require(XmlPullParser.END_TAG,null,"menu");
  14. }
  15. publicstaticvoidmain(String[]args)throwsException{
  16. newMenu().parseXml(newStringReader("<?xmlversion='1.0'?>"
  17. +"<menu>"
  18. +"<item>Waffles</item>"
  19. +"<item>Coffee</item>"
  20. +"</menu>"));
  21. }
在android4.0中,改变了Xml.newPullParser()返回KxmlParser类,同时删除了ExpatPullParser类。这样就修正了 nextTag()的bug.

不幸的是,当前可能会崩溃的应用程序都是低于android4.0版本的,下面是错误信息。

[html] view plain copy
  1. org.xmlpull.v1.XmlPullParserException:expected:END_TAG{null}item(position:START_TAG<item>@1:37in[email protected])
  2. atorg.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
  3. atcom.publicobject.waffles.Menu.parseXml(Menu.java:25)
  4. atcom.publicobject.waffles.Menu.main(Menu.java:32)
解决的办法是只有在调用 nextText()之后再跳用 nextTag(),仅当当前的位置不是 END_TAG。
[html] view plain copy
  1. while(parser.nextTag()==XmlPullParser.START_TAG){
  2. parser.require(XmlPullParser.START_TAG,null,"item");
  3. StringitemText=parser.nextText();
  4. if(parser.getEventType()!=XmlPullParser.END_TAG){
  5. parser.nextTag();
  6. }
  7. parser.require(XmlPullParser.END_TAG,null,"item");
  8. System.out.println("menuoption:"+itemText);
  9. }
上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了 nextText(),那就在使用 nextText()的地方用下面的辅助方法。
[html] view plain copy
  1. privateStringsafeNextText(XmlPullParserparser)
  2. throwsXmlPullParserException,IOException{
  3. Stringresult=parser.nextText();
  4. if(parser.getEventType()!=XmlPullParser.END_TAG){
  5. parser.nextTag();
  6. }
  7. returnresult;
  8. }
使用单一的XmlPullParse简化了我们的维护,同时可以让我们有更多的精力花费在调高系统的性能。

更多相关文章

  1. android怎么将已经安装在内存上的应用程序移动到SD卡上
  2. android 动态注册 广播
  3. android中webView中对HTML的一些操作【更新代码】
  4. Android(安卓)native 内存泄露检测
  5. android播放器音量控制-使用震动示例代码-进度条控制音量
  6. Android(安卓)-- Context
  7. Android遇到的问题解决方法
  8. 常用的Android(安卓)Widget组件学习①--Button and TextView
  9. SQlite数据库(4)---DAO(data access object)数据访问对象

随机推荐

  1. Android(安卓)视频播放
  2. relative相关属性
  3. android 把TextView中的文字添加阴影效果
  4. android 图片 上下左右滑动,能放大放小
  5. android 解决小米手机Android(安卓)Studi
  6. android文件关联之mime type
  7. Android:TextView跑马灯-详解
  8. Android构建工具
  9. 命令行装android
  10. 2011.07.08(5)——— android shortcut