1. 程式人生 > >_045_Android_xml檔案解析器XmlPullParser

_045_Android_xml檔案解析器XmlPullParser

轉自https://www.cnblogs.com/GeekSeer/p/5981125.html,感謝作者的無私分享。 

 Pull解析與Sax一樣.都屬於事件驅動的解析方式.。相比Sax解析過程更加靈活.
sax一旦開始解析就是從頭讀到尾.不解析完整個文件不會停。
pull解析較為靈活.是以事件為單位.手動向下繼續. 如果獲得到我們要找的內容. 可以停止繼續解析.

物件的種類

Document         整個xml文件物件

Element          文件中的標籤物件

Atritube          標籤中的屬性物件

Text                                         標籤體的內容的物件

Common         註釋物件

常用事件

START_DOCUMENT    文件開始

END_DOCUMENT      文件結束 

START_TAG         元素開始

END_TAG         元素結束

 常用方法

1.xml解析獲得標籤屬性值:

String number = parser.getAttributeValue(0);   //通過索引獲取 這邊只有一個屬性number 
String number =parser.getAttributeValue(null,"cityname");  //null:固定值;cityname:屬性的名字

2.獲得開始標籤之後的標籤體內容

 if("name".equals(parser.getName())){     //解析到了name開始標籤就獲取值
String name = parser.nextText();           //xml解析獲得文字屬性parser.nextText(); 注意:這邊if條件中獲取的是name標籤開始的位置 因此用nextText()方法獲取標籤體內容
stu.setName(name);
}

public class PullTool {

    //寫一個解析XML檔案的方法
    /**
     * 返回值:List<Student>
     * 引數:InputStream is
     * 注意 工具類中的方法寫成靜態
     * @throws XmlPullParserException 
     */
    public static List<Student> parserXml(InputStream is) throws Exception{
        //A.初始化集合以及Student物件
        List<Student> list = null;
        Student stu = null;
        //B.建立生產XML的pull解析器的工廠
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //C.使用工廠獲取pull解析器
        XmlPullParser parser = factory.newPullParser();
        //D.使用解析器讀取當前的xml流
        parser.setInput(is, "UTF-8");    
//傳入InputStream物件 並且設定解碼規則需和XML文件中設定的一致
        //E.獲取當前事件的狀態
        int type = parser.getEventType(); 
        /**
         * 我們知道pull解析是以事件為單位解析
的因此我們要獲取一開始的解析標記type,之後通過type判斷迴圈來讀取文件
         * 注意:當解析器開始讀取is的時候已經開
始了,指標type在xml的第一行開始。pull解析是指標從第一行
開始讀取到最後一行以事件為單位讀取的解析方式
         */
        //F.通過while迴圈判斷是否讀取到了文件結束
        while(type != parser.END_DOCUMENT){
            
            switch (type) {
            case XmlPullParser.START_TAG:
                //判斷當前遇到的元素名稱是否為students
                if("students".equals(parser.getName())){
                    list = new ArrayList<Student>();
                }else if("student".equals(parser.getName())){
                    //初始化Student物件
                    stu = new Student();
                    //讀取number屬性
                    String number = parser.getAttributeValue(null,"number");   
                    //String number = parser.getAttributeValue(0);     
//也可以通過索引獲取 這邊只有一個屬性number 
                    //xml解析獲得標籤屬性值:parser.getAttributeValue(null,"cityname")
//null:固定值;cityname:屬性的名字
                    
                    stu.setNumber(number);  //將資料封裝到學生類中
                }else if("name".equals(parser.getName())){
                    String name =  parser.nextText();    
//xml解析獲得文字屬性
//parser.nextText();   
注意:這邊if條件中獲取的是name標籤開始的位置 
//因此用nextText()方法獲取標籤體內容
                    stu.setName(name);
                }else if("sex".equals(parser.getName())){
                    String sex =  parser.nextText();
                    stu.setSex(sex);
                }else if("age".equals(parser.getName())){
                    int  age =  Integer.parseInt(parser.nextText());
                    stu.setAge(age);
                }
                
                break;
            case XmlPullParser.END_TAG:
                if("student".equals(parser.getName())){
                    list.add(stu);
                    stu = null;
                }
                break;
            default:
                break;
            }
            
            //讓解析器向下解析一行,並返回改行的事件常量 
// 這樣配合while(type != parser.END_DOCUMENT)讀取完整個文件
            type = parser.next();
            
        }
        return list;
    }
    
    public static void main(String[] args) throws Exception {
        FileInputStream is = new FileInputStream("src/stu.xml");
        
        List<Student> list = PullTool.parserXml(is);
        
        System.out.println(list);
        
        is.close();
    }
}
   //使用Xml pull 解析器去解析 xml 檔案的內容
        XmlPullParser xmlPullParser = Xml.newPullParser();

        try {
            //解析的源是什麼?- - - result.xml
            InputStream in = getAssets().open("result.xml");
            xmlPullParser.setInput(in,"utf-8");

            //獲得一個事件型別
            int eventType = xmlPullParser.getEventType();

            //準備Product類的一個例項,去封裝資料
            Product p =null;
            while (eventType!=XmlPullParser.END_DOCUMENT){

                if(eventType==XmlPullParser.START_TAG){

                    //判斷是否是元素的開始,只要是某個元素的開始位置,那麼就會進入這裡
                    //獲得當前解析到的元素的名稱
                    if("product".equals(xmlPullParser.getName())){
                        p = new Product();
                        String type = xmlPullParser.getAttributeValue(0);
                        p.setType(type);
                    }else if("phonenum".equals(xmlPullParser.getName())){
                        String number = xmlPullParser.nextText();
                        p.setNumber(number);
                    }else if("location".equals(xmlPullParser.getName())){
                        String location = xmlPullParser.nextText();
                        p.setLocation(location);
                    }else  if("phoneJx".equals(xmlPullParser.getName())){
                        String phoneJx = xmlPullParser.nextText();
                        p.setPhoneJx(phoneJx);
                        System.out.println(p);
                    }
                }
                eventType=xmlPullParser.next();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }