天天看點

pull解析器解析xml

    利用pull解析XML檔案需要下面幾個步驟:

     1)擷取XMLPullParser對象。這裡有兩個方法:通過XMLPullParserFactory擷取XMLPullParser對象,或者直接使用Xml.newPullParser()方法擷取。栗子如代碼一所示。

     2)通過XMLPullParser對象設定輸入流。

     3)通過parser.next(),持續的解析XML檔案直到檔案的尾部。

下面的幾個方法是經常需要的:XMLPullParserFacotry.newInstance( )    facotry.newPullParser( )  Xml.newPullParser() parser.setInput( )     parser.next( ).

注意: 1)parser.next()方法使指向下移一個最小元素。 舉個栗子: <title>靜夜思</title> 這這裡首先指向<title>,調用parser.next()後,會指向 靜夜思 ,再調用parser.next(),指向</title>。 2)我無論使用現有的xml檔案還是用xml字元串作為資料源,parser.nextText()方法皆不好使,會報XmlPullParserException。暫不知原因。 3)使用xml檔案做資料源時,使用parser.next()會報nullpointexception。不知道原因,猜測是格式有誤。 4)解析xml時,有以下方式: 方式一,判斷标簽類型。下面是栗子。

while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    Log.d("tag", "StartDocument3--" + parser.getName());
                }
                if (eventType == XmlPullParser.START_TAG) {
                    Log.d("tag", "StartTag--" + parser.getName());
                }
                if (eventType == XmlPullParser.TEXT) {
                    Log.d("tag", "Text--" + parser.getText());
                }
                if (eventType == XmlPullParser.END_TAG) {
                    Log.d("tag", "EndTag--" + parser.getName());
                }
           

方式二,判斷标簽name,下面是栗子。

while (eventType != XmlPullParser.END_DOCUMENT) {
                Log.i("xml", "WhileBegin--");
                if ("poem".equals(parser.getName())) {
                    Log.i("xml", "poem--" + parser.getName());
                } else if ("title".equals(parser.getName())) {
                    Log.i("xml", "title--" + parser.getName());
                } else if ("author".equals(parser.getName())) {
                    Log.i("xml", "author--" + parser.getName());
                } else if ("content".equals(parser.getName())) {
                    Log.i("xml", "content--" + parser.getName());
                }
           

方式三,兩者混合,本人比較推薦。

while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
            case XmlPullParser.START_TAG:
                Log.i("WeatherService", "StartTag");
                if ("infos".equals(parser.getName())) {
                    weatherInfos = new ArrayList<WeatherInfo>();
                } else if ("city".equals(parser.getName())) {
                    weatherInfo = new WeatherInfo();
                    String idStr = parser.getAttributeValue(0);
                    weatherInfo.setId(Integer.parseInt(idStr));
                } else if ("name".equals(parser.getName())) {
                    type = parser.next();
                    String name = parser.getText();
                    weatherInfo.setName(name);
                }
            case XmlPullParser.TEXT:
                Log.i("WeatherService", "XmlText");    
                break;
            case XmlPullParser.START_DOCUMENT:
                Log.i("WeatherService", "StartDoc");
                break;
            case XmlPullParser.END_TAG:
                Log.i("WeatherService", "EndTag");
                if ("city".equals(parser.getName())) {
                    weatherInfos.add(weatherInfo);
                    weatherInfo = null;
                }
                break;
            }
           

代碼如下: 代碼一:使用字元串作為資料源

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            XmlPullParserFactory factory;// 1.第一步,建立解析工廠
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);  // 設定支援命名空間
            XmlPullParser parser = factory.newPullParser();// 2.生成parser對象
            // 3.設定輸入
            parser.setInput(new StringReader(
                    "<?xml version=\"1.0\" ?><poem><title>靜夜思</title><author>李白</author><content>床前明月光,疑似地上霜,舉頭忘明月,低頭思故鄉</content></poem>"));
            int eventType = parser.getEventType();// 擷取輸入類型
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    Log.d("tag", "StartDocument3--" + parser.getName());
                }
                if (eventType == XmlPullParser.START_TAG) {
                    Log.d("tag", "StartTag--" + parser.getName());
                }
                if (eventType == XmlPullParser.TEXT) {
                    Log.d("tag", "Text--" + parser.getText());
                }
                if (eventType == XmlPullParser.END_TAG) {
                    Log.d("tag", "EndTag--" + parser.getName());
                }
                eventType = parser.next(); // 不斷的去更新
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            XmlPullParser parser = Xml.newPullParser();  // 1.生成parser對象
            // 2.設定輸入
            parser.setInput(new StringReader(
                    "<?xml version=\"1.0\" ?><poem><title>靜夜思</title><author>李白</author><content>床前明月光,疑似地上霜,舉頭忘明月,低頭思故鄉</content></poem>"));
            int eventType = parser.getEventType();// 擷取輸入類型
            while (eventType != XmlPullParser.END_DOCUMENT) {
                Log.i("xml", "WhileBegin--");
                if ("null".equals((String) parser.getName())) {
                    Log.i("xml", "null--" + parser.getName());
                } else if ("poem".equals(parser.getName())) {
                    Log.i("xml", "poem--" + parser.getName());
                    //這裡使用getNext()方法會造成XmlPullParserException錯誤,原因不知
                    //Log.i("xml", "poemNextText--" + parser.nextText());
                } else if ("title".equals(parser.getName())) {
                    Log.i("xml", "title--" + parser.getName());
                } else if ("author".equals(parser.getName())) {
                    Log.i("xml", "author--" + parser.getName());
                } else if ("content".equals(parser.getName())) {
                    Log.i("xml", "content--" + parser.getName());
                }
                eventType = parser.next(); // 不斷的去更新
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           

代碼二:

public class WeatherService {
    public static List<WeatherInfo> getWeatherInfos(InputStream iStream)
            throws Exception {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(new StringReader(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?><infos><city id=\"1\" ><name>上海</name><weather>多雲</weather><temp>20℃/30℃</temp><pm>80</pm><wind>1級 </wind></city><city id=\"2\" ><name>北京</name><weather>晴天</weather><temp>26℃/32℃</temp><pm>120</pm><wind>2級</wind></city><city id=\"3\" ><name>吉林</name><weather>小雨</weather><temp>14℃/25℃</temp><pm>60</pm><wind>2級</wind></city></infos>"));

        List<WeatherInfo> weatherInfos = null;
        WeatherInfo weatherInfo = null;
        int type = parser.getEventType();
        Log.i("parserType",String.valueOf(type));
        Log.i("parserEndDoc",String.valueOf(XmlPullParser.END_DOCUMENT));
        while (type != XmlPullParser.END_DOCUMENT) {
            Log.i("WeatherService", "while");
            switch (type) {
            case XmlPullParser.START_TAG:
                Log.i("WeatherService", "StartTag");
                if ("infos".equals(parser.getName())) {
                    weatherInfos = new ArrayList<WeatherInfo>();
                } else if ("city".equals(parser.getName())) {
                    weatherInfo = new WeatherInfo();
                    String idStr = parser.getAttributeValue(0);
                    weatherInfo.setId(Integer.parseInt(idStr));
                } else if ("name".equals(parser.getName())) {
                    type = parser.next();
                    String name = parser.getText();
                    weatherInfo.setName(name);
                } else if ("weather".equals(parser.getName())) {
                    type = parser.next();
                    String weather = parser.getText();
                    weatherInfo.setWeather(weather);
                } else if ("temp".equals(parser.getName())) {
                    type = parser.next();
                    String temp = parser.getText();
                    weatherInfo.setTemp(temp);
                } else if ("pm".equals(parser.getName())) {
                    type = parser.next();
                    String pm = parser.getText();
                    weatherInfo.setPm(pm);
                } else if ("wind".equals(parser.getName())) {
                    type = parser.next();
                    String wind = parser.getText();
                    weatherInfo.setWind(wind);
                }
            case XmlPullParser.TEXT:
                Log.i("WeatherService", "XmlText");    
                break;
            case XmlPullParser.START_DOCUMENT:
                Log.i("WeatherService", "StartDoc");
                break;
            case XmlPullParser.END_TAG:
                Log.i("WeatherService", "EndTag");
                if ("city".equals(parser.getName())) {
                    weatherInfos.add(weatherInfo);
                    weatherInfo = null;
                }
                break;
            }
            type = parser.next();
        }
        iStream.close();
        return weatherInfos;
    }
}
           

參考頁面 1) XML解析之PULL解析: http://my.oschina.net/summerpxy/blog/201911?fromerr=oxPjkR9r 2)pull解析和生成xml檔案 http://www.cnblogs.com/linjiqin/archive/2011/05/24/2055689.html

繼續閱讀