/** * Created by John on 2016/3/29. */ public class XmlParser { private static final String ns = null; /** * 建立一個解析器 * @param is 傳入數據的輸入流 * @return 返回一個裝有entry標籤的arraylist * @throws XmlPullParserException 拋出異常 * @throws IOException 拋出異常 */ public List parse(InputStream is) throws XmlPullParserException, IOException { try { XmlPullParser parser = Xml.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(is, null); parser.nextTag(); return readFeed(parser); } finally { is.close(); } } /** * 獲取一個feed標籤 * @param parser 傳入解析器 * @return 返回一個List,將全部的entry字段封裝在裏面 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private List readFeed(XmlPullParser parser) throws IOException, XmlPullParserException { List entries = new ArrayList(); parser.require(XmlPullParser.START_TAG,ns,"feed"); while(parser.next() != XmlPullParser.END_TAG){ continue; } String name = parser.getName(); if (name.equals("entry")){ entries.add(readEntry(parser)); }else { skip(parser); } return entries; } /** * 獲取entry標籤 * @param parser 傳入解析器 * @return 返回一個Entry數據,傳入實體類以便於使用 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private Entry readEntry(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_TAG,ns,"entry"); String title = null; String link = null; String summary = null; while (parser.next() != XmlPullParser.END_TAG){ if (parser.getEventType() != XmlPullParser.START_TAG){ continue; } String name = parser.getName(); if (name.equals("title")){ title = readTitle(parser); }else if (name.equals("link")){ link = readLink(parser); }else if(name.equals("summary")){ summary = readSummary(parser); }else { skip(parser); } } return new Entry(title,summary,link); } /** * 獲取summary標籤 * @param parser 傳入解析器 * @return 返回一個標籤 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_TAG,ns,"summary"); String summary = readText(parser); parser.require(XmlPullParser.END_TAG,ns,"summary"); return summary; } /** * 獲取link標籤 * @param parser 傳入解析器 * @return 返回一個link標籤 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException { String link = ""; parser.require(XmlPullParser.START_TAG,ns,"link"); String tag = parser.getName(); String relType = parser.getAttributeValue(null,"rel"); if (tag.equals("link")){ if (relType.equals("alternate")){ link = parser.getAttributeValue(null,"href"); parser.nextTag(); } } parser.require(XmlPullParser.END_TAG,ns,"link"); return link; } /** * 獲取title標籤 * @param parser 傳入解析器 * @return 返回一個標籤 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_TAG,ns,"title"); String title = readText(parser); parser.require(XmlPullParser.END_TAG,ns,"title"); return title; } /** * 獲取標籤中的文本 * @param parser 傳入解析器 * @return 返回一個字符串 * @throws IOException 拋出異常 * @throws XmlPullParserException 拋出異常 */ private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { String result = ""; if (parser.next() == XmlPullParser.TEXT){ result = parser.getText(); parser.nextTag(); } return result; } /** * 跳過不須要的標籤 * @param parser 傳入解析工具parser * @throws XmlPullParserException 拋出異常 * @throws IOException 拋出異常 */ private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG){ // throw new IllegalStateException(); } int depth = 1; while (depth != 0){ switch (parser.next()){ case XmlPullParser.END_TAG: depth --; break; case XmlPullParser.START_TAG: depth ++; break; } } } /** * 建立一個Entry實體類 */ public static class Entry{ public final String title; public final String link; public final String summary; private Entry(String title, String summary, String link) { this.title = title; this.summary = summary; this.link = link; } } }
這是一個簡單的工具類,若是須要獲取其餘字段也能夠本身添加~!工具