android xml 的解析.

1.普通型



Xml代码  

android xml解析 XmlPullParser的使用_Java



    1. <?xml version=”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代码  

    android xml解析 XmlPullParser的使用_Java



    1. try{  
    2. xpp.setInput( new
    3. XmlPullParser parser = XmlPullParserFactory.newInstance()  
    4. .newPullParser();  
    5. int
    6. while
    7. if
    8. String name = parser.getName();  
    9. Log.v(“tag”,parser.getName()+”=”+parser.next());  
    10. }  
    11. eventType = parser.next();  
    12. }  
    13. } catch
    14. } catch
    15. }



    2.嵌套子类.



    Xml代码  

    android xml解析 XmlPullParser的使用_Java



      1. <?xml version=”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代码  

      android xml解析 XmlPullParser的使用_Java



      1. try{  
      2. XmlPullParser parser = XmlPullParserFactory.newInstance()  
      3. .newPullParser();  
      4. new
      5. parser.next();  
      6. parser.require(XmlPullParser.START_TAG, null, “statuses”);  
      7. while
      8. parser.require(XmlPullParser.START_TAG, null, “status”);  
      9. for (int i=0;i<3;i++){  
      10. parser.nextTag();  
      11. Log.v(“tag”,parser.getName()+”=”+ parser.nextText());  
      12. }  
      13. while
      14. parser.require(XmlPullParser.START_TAG, null, “user”);  
      15. while
      16. String name = parser.getName();  
      17. String text2 = 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
      30. } catch
      31. }



      最里面那个可以满足 <user>也是循环. 如果<user>不循环.



      可以使用.



      Java代码  

      android xml解析 XmlPullParser的使用_Java


      1. for (int i=0;i<3;i++){  
      2. parser.nextTag();  
      3. Log.v(“tag”,parser.getName()+”=”+ parser.nextText());  
      4. }


      代替.

      开发过程中遇到 XmlPullParser.netText()方法造成的Bug
      解决如下:

      在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法 。Android已经在历史上有两个实现这个接口实现类:


      因此,一些应用可能会出现bug在额外调用next()或nextTag();



      [html]  view plain copy


      1.     throws XmlPullParserException, IOException {  
      2. parser = Xml.newPullParser();  
      3.     parser.setInput(reader);  
      4.   
      5.     parser.nextTag();  
      6.     parser.require(XmlPullParser.START_TAG, null, "menu");  
      7.     while (parser.nextTag() == XmlPullParser.START_TAG) {  
      8.         parser.require(XmlPullParser.START_TAG, null, "item");  
      9. itemText = parser.nextText();  
      10.         parser.nextTag(); // this call shouldn’t be necessary!  
      11.         parser.require(XmlPullParser.END_TAG, null, "item");  
      12.         System.out.println("menu option: " + itemText);  
      13.     }  
      14.     parser.require(XmlPullParser.END_TAG, null, "menu");  
      15. }  
      16.   
      17. public static void main(String[] args) throws Exception {  
      18. <?xml version='1.0'?>"  
      19. <menu>"  
      20. <item>Waffles</item>"  
      21. <item>Coffee</item>"  
      22. </menu>"));  
      23. }

      在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:37 in java.io.StringReader@40442fa8)   
      2.      at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)  
      3.      at com.publicobject.waffles.Menu.parseXml(Menu.java:25)  
      4.  at com.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. itemText = 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("menu option: " + itemText);  
      9.  }

      上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了

      nextText(),那就在使用 nextText()的地方用下面的辅助方法。

      [html]  view plain copy



        1. private String safeNextText(XmlPullParser parser)  
        2.          throws XmlPullParserException, IOException {  
        3. result = parser.nextText();  
        4.      if (parser.getEventType() != XmlPullParser.END_TAG) {  
        5.          parser.nextTag();  
        6.      }  
        7.      return result;  
        8.  }




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

        android xml 的解析.

        1.普通型



        Xml代码  

        android xml解析 XmlPullParser的使用_Java



          1. <?xml version=”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代码  

          android xml解析 XmlPullParser的使用_Java


          1. try{  
          2. xpp.setInput( new
          3. XmlPullParser parser = XmlPullParserFactory.newInstance()  
          4. .newPullParser();  
          5. int
          6. while
          7. if
          8. String name = parser.getName();  
          9. Log.v(“tag”,parser.getName()+”=”+parser.next());  
          10. }  
          11. eventType = parser.next();  
          12. }  
          13. } catch
          14. } catch
          15. }



          2.嵌套子类.



          Xml代码  

          android xml解析 XmlPullParser的使用_Java


          1. <?xml version=”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代码  

          android xml解析 XmlPullParser的使用_Java


          1. try{  
          2. XmlPullParser parser = XmlPullParserFactory.newInstance()  
          3. .newPullParser();  
          4. new
          5. parser.next();  
          6. parser.require(XmlPullParser.START_TAG, null, “statuses”);  
          7. while
          8. parser.require(XmlPullParser.START_TAG, null, “status”);  
          9. for (int i=0;i<3;i++){  
          10. parser.nextTag();  
          11. Log.v(“tag”,parser.getName()+”=”+ parser.nextText());  
          12. }  
          13. while
          14. parser.require(XmlPullParser.START_TAG, null, “user”);  
          15. while
          16. String name = parser.getName();  
          17. String text2 = 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
          30. } catch
          31. }



          最里面那个可以满足 <user>也是循环. 如果<user>不循环.



          可以使用.



          Java代码  

          android xml解析 XmlPullParser的使用_Java


          1. for (int i=0;i<3;i++){  
          2. parser.nextTag();  
          3. Log.v(“tag”,parser.getName()+”=”+ parser.nextText());  
          4. }



          代替.

          开发过程中遇到 XmlPullParser.netText()方法造成的Bug
          解决如下:

          在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法 。Android已经在历史上有两个实现这个接口实现类:


          因此,一些应用可能会出现bug在额外调用next()或nextTag();



          [html]  view plain copy



          1.     throws XmlPullParserException, IOException {  
          2. parser = Xml.newPullParser();  
          3.     parser.setInput(reader);  
          4.   
          5.     parser.nextTag();  
          6.     parser.require(XmlPullParser.START_TAG, null, "menu");  
          7.     while (parser.nextTag() == XmlPullParser.START_TAG) {  
          8.         parser.require(XmlPullParser.START_TAG, null, "item");  
          9. itemText = parser.nextText();  
          10.         parser.nextTag(); // this call shouldn’t be necessary!  
          11.         parser.require(XmlPullParser.END_TAG, null, "item");  
          12.         System.out.println("menu option: " + itemText);  
          13.     }  
          14.     parser.require(XmlPullParser.END_TAG, null, "menu");  
          15. }  
          16.   
          17. public static void main(String[] args) throws Exception {  
          18. <?xml version='1.0'?>"  
          19. <menu>"  
          20. <item>Waffles</item>"  
          21. <item>Coffee</item>"  
          22. </menu>"));  
          23. }

          在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:37 in java.io.StringReader@40442fa8)   
          2.      at org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)  
          3.      at com.publicobject.waffles.Menu.parseXml(Menu.java:25)  
          4.  at com.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. itemText = 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("menu option: " + itemText);  
          9.  }

          上面的代码可以正确解析所有xml版本,如果应用程序广范的使用了

          nextText(),那就在使用 nextText()的地方用下面的辅助方法。

          [html]  view plain copy



          1. private String safeNextText(XmlPullParser parser)  
          2.          throws XmlPullParserException, IOException {  
          3. result = parser.nextText();  
          4.      if (parser.getEventType() != XmlPullParser.END_TAG) {  
          5.          parser.nextTag();  
          6.      }  
          7.      return result;  
          8.  }