zoukankan      html  css  js  c++  java
  • 用PULL解析器解析XML文件

    第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值):

     1 package lee.service;   
     2   
     3 import java.io.InputStream;   
     4 import java.util.ArrayList;   
     5 import java.util.List;   
     6 import org.xmlpull.v1.XmlPullParser;   
     7 import android.util.Xml;   
     8 import lee.vo.Person;   
     9   
    10 public class XMLPullService {   
    11        
    12     public List<Person> readXML(InputStream inStream) throws Exception{   
    13        
    14         List<Person> persons = null;   
    15            
    16         Person person = null;   
    17            
    18         XmlPullParser pullParser = Xml.newPullParser(); //获取Pull解析器 Xml.newPullParser()添加一个pullParser解析器带命名空间的支持   
    19            
    20         pullParser.setInput(inStream, "UTF-8");     //设置Pull解析器进行解析的XML内容   
    21            
    22         int event = pullParser.getEventType();      //获取第一个事件   
    23            
    24         while(event!=XmlPullParser.END_DOCUMENT)    //如果还不是结束文档事件,迭代每一个元素   
    25         {   
    26             switch (event)   
    27             {   
    28             case XmlPullParser.START_DOCUMENT:              //开始文档事件   
    29                 persons = new ArrayList<Person>();   
    30                 break;   
    31        
    32             case XmlPullParser.START_TAG:                   //开始元素事件   
    33                 if("person".equals(pullParser.getName()))       //pullParser.getName()得到当前指针所指向的节点的名称   
    34                 {   
    35                     person = new Person();   
    36                     int id = new Integer(pullParser.getAttributeValue(0));   
    37                     person.setId(id);   
    38                 }   
    39                 if(person!=null)   
    40                 {   
    41                     if("name".equals(pullParser.getName()))   
    42                     {   
    43                         String name = pullParser.nextText();    //得到当前节点下一个文本节点的内容------>  <name>liming</name> 得到liming   
    44                         person.setName(name);   
    45                     }   
    46                     else if("age".equals(pullParser.getName()))   
    47                     {   
    48                         String age = pullParser.nextText(); //获取下一个Text类型节点的值   
    49                         person.setAge(new Short(age));   
    50                     }   
    51                 }   
    52                 break;   
    53             case XmlPullParser.END_TAG:                 //结束元素事件   
    54                 if("person".equals(pullParser.getName()))   
    55                 {   
    56                     persons.add(person);   
    57                     person = null;   
    58                 }   
    59                 break;   
    60             }   
    61             event = pullParser.next();                  //进入下一个元素并触发相应事件   
    62         }   
    63         return persons;   
    64     }   
    65 } 

     第二种方式(较为复杂,用pullparser.Next()来进入下一个元素,用.textNext来返回当前String类型元素的值):

     1 public class PullXmlActivity extends Activity{  
     2     private List<Book> list=null;  
     3     private PullXmlAdapter adapter;  
     4     private ListView lv;  
     5     @Override  
     6     protected void onCreate(Bundle savedInstanceState) {  
     7         // TODO Auto-generated method stub   
     8         super.onCreate(savedInstanceState);  
     9         setContentView(R.layout.listview);  
    10         lv=(ListView)findViewById(R.id.listView);  
    11         InputStream in;  
    12         try {  
    13             in = this.getAssets().open("books.xml");  
    14               
    15             list=pullxml(in);  
    16               
    17         } catch (IOException e) {  
    18             // TODO Auto-generated catch block   
    19             e.printStackTrace();  
    20         } catch (Exception e) {  
    21             // TODO Auto-generated catch block   
    22             e.printStackTrace();  
    23         }  
    24         adapter=new PullXmlAdapter(PullXmlActivity.this, list);   
    25         lv.setAdapter(adapter);  
    26     }  
    27     /**xml文件的获取 
    28      * 1.xml文件放在res的xml文件夹下(推荐)使用XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX); 
    29      * 2.xml文件放在raw的xml文件夹下使用InputStream inputStream =this.getResources().openRawResource(R.raw.XXX);  
    30      * 3.xml文件放在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>, 
    31      * 否则解析报错,具体原因未查明:InputStream inputStream = getResources().getAssets().open(fileName); 
    32      * 4.xml文件放在SD卡, path路径根据实际项目修改,此次获取SDcard根目录:    
    33      * String path = Environment.getExternalStorageDirectory().toString();   
    34      * File xmlFlie = new File(path+fileName);   
    35      * InputStream inputStream = new FileInputStream(xmlFlie);   
    36      */  
    37     public List<Book> pullxml(InputStream in)throws Exception{  
    38         List<Book> list=null;  
    39         Book book = null;  
    40             // 由android.util.Xml创建一个XmlPullParser实例   
    41             XmlPullParser parser = Xml.newPullParser();  
    42             // 设置输入流 并指明编码方式   
    43                parser.setInput(in, "UTF-8");  
    44             // 产生第一个事件   
    45                int eventType = parser.getEventType();  
    46                  
    47                while (eventType != XmlPullParser.END_DOCUMENT) {  
    48                    switch (eventType) {  
    49                 // 判断当前事件是否为文档开始事件   
    50                    case XmlPullParser.START_DOCUMENT:  
    51                        list=new ArrayList<Book>();// 初始化list集合   
    52                        break;  
    53                     // 判断当前事件是否为标签元素开始事件   
    54                    case XmlPullParser.START_TAG:  
    55                        if (parser.getName().equals("book")) { // 判断开始标签元素是否是book   
    56                            book = new Book();  
    57                        } else if (parser.getName().equals("id")) {  
    58                            eventType = parser.next();  
    59                            // 得到book标签的属性值,并设置book的id   
    60                             book.setId(Integer.parseInt(parser.getText()));  
    61                         } else if (parser.getName().equals("name")) { // 判断开始标签元素是否是book   
    62                              eventType = parser.next();  
    63                              book.setName(parser.getText());  
    64                         } else if (parser.getName().equals("price")) { // 判断开始标签元素是否是price   
    65                             eventType = parser.next();  
    66                              book.setPrice(Float.parseFloat(parser.getText()));  
    67                         }  
    68                        break;  
    69                     // 判断当前事件是否为标签元素结束事件   
    70                    case XmlPullParser.END_TAG:  
    71                        if (parser.getName().equals("book")) { // 判断结束标签元素是否是book   
    72                            list.add(book); // 将book添加到books集合   
    73                            book = null;  
    74                        }  
    75                        break;  
    76                    }  
    77                    // 进入下一个元素并触发相应事件   
    78                    eventType = parser.next();  
    79                }  
    80                return list;  
    81     }  
    82 }  
  • 相关阅读:
    求周期串的最小正周期
    Manacher's Algorithm
    高精度
    找x的两个素数因子使x=pq(Pollard_Rho)
    Intersection is not allowed!
    类欧几里得
    分数规划
    'sessionFactory' or 'hibernateTemplate' is required
    Struts2的动态方法,及result跳转方式,全局结果以及默认的action的配置
    配置Struts2及Struts2访问servlet api的方式
  • 原文地址:https://www.cnblogs.com/ycxyyzw/p/2943862.html
Copyright © 2011-2022 走看看