大家都知道Android解析xml数据有常见的三种方式:
第一种方式:DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
第二种方式:SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
第三种方式:PULL解析器:
Android并未提供对Java StAX API的支持。但是,Android附带了一个pull解析器,其工作方式类似于StAX。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。
今天咱们就以PULL解析器为例,其他方式后续会继续相继更新
public void onclick(View view) {
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://apis.juhe.cn/idcard/index?
key=69d5592ab41bdc40410e7fe34f9c" +
"69d4&cardno=330326198903081211&dtype=xml";
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, "UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
Log.i("start_document", "start_document");
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("resultcode".equals(parser.getName())) {
resultcode = parser.nextText();
Message message = new Message();
Bundle b = new Bundle();
b.putString("resultcode", resultcode);
message.setData(b);
PullXml.this.handler.sendMessage(message);}
if (("reason").equals(parser.getName())) {
reason = parser.nextText();
}
if ("error_code".equals(parser.getName())) {
error_code = parser.nextText();
}
break;
case XmlPullParser.END_TAG:
break;
}
event = parser.next();
}
}
} catch (Exception e) {
Looper.prepare();
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
Looper.loop();
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
textView.setText(resultcode + reason + error_code);
}