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>