Android pull解析

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值