XML解析有三种,我在这里就说一下Android中的pull解析:
使用pull解析,我们就得获取XmlPullParser的对象。有两种方法:
方法1:
通过Xml.newPullParser();
例:XmlPullParserparser = Xml.newPullParser();
方法2:
通过XmlPullParserFactory
例:XmlPullParserFactoryfactory = XmlPullParserFactory .newInstance ();
factory . setNamespaceAware ( true );
XmlPullParser xpp = factory . newPullParser();
官方文档使用的方法2。(优缺点我也不太清楚,希望清楚的大神留言相告)
当我们获取了XmlPullParser对象后我们的了解几个常量所代表的意思:
解析器的事件当前的状态可以通过调用来确定 getEventType()方法。最初,该解析器是在START_DOCUMENT 状态。
next()方法使解析器前进到下一个事件。从返回的整型值,接着确定当前的解析器状态。以下事件类型由next()的可见
START_TAG一个XML开始标签被读取。
TEXT文本内容被读取,文本内容可以用getText()方法来检索。(当在验证模式下的next()将不会报告忽略的空白,使用的nextToken()代替)
END_TAG一个结束标签读取
END_DOCUMENT没有更多的事件可被解析
下面就看具体的例子:
先建一个Android工程,并建一个android.xml放在src里面
MainActivity里面只有一个button,用来跳转到PullActivity里面,代码就不贴了。
主要看PullActivity中的代码:
public class PullActivity extends Activity { private PersonInfo personInfo; private Boolean flag = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pull); new MyAsyncTask().execute(); } private InputStream getStream(String str) { InputStream is = PullActivity.class.getClassLoader() .getResourceAsStream(str); return is; } private void PullAnalyze(InputStream stream) throws Exception { // 实例化一个XmlPullParser对象 XmlPullParser parser = Xml.newPullParser(); // 设置输入流和编码 parser.setInput(stream, "UTF-8"); // 触发了第一个事件,也就是其默认的事件 int eventCode = parser.getEventType(); // 判断是不是最后,如果不是最后,就继续进行 while (eventCode != XmlPullParser.END_DOCUMENT) { switch (eventCode) { case XmlPullParser.START_DOCUMENT: { // 这里在开发的时候会做一下初始化操作 break; } case XmlPullParser.START_TAG: { // 开始进行解析 if ("person".equals(parser.getName())) { flag = true; personInfo = new PersonInfo(); personInfo.setId(Integer.valueOf(parser .getAttributeValue(0))); } if (flag) { if ("name".equals(parser.getName())) { // 这里我做的打印,是为了简单判断,尽量用log System.out.println("------------>flag" + flag); personInfo.setName(parser.nextText()); } else if ("age".equals(parser.getName())) { personInfo.setAge(Integer.valueOf(parser.nextText())); } } break; } case XmlPullParser.END_TAG: { if ("person".equals(parser.getName()) && personInfo != null) { flag = false; System.out.println("--------------->personInfo" + personInfo.toString()); personInfo = null; } break; } } // 这句非常重要 eventCode = parser.next(); } } private class MyAsyncTask extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { try { PullAnalyze(getStream("android.xml")); } catch (Exception e) { e.printStackTrace(); } return null; } }
XML:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1" > <name>qqq1</name> <age>21</age> </person> <person id="2" > <name>www2</name> <age>22</age> </person> </persons>