标签:
作用:在网络上传输数据时最常用的格式有两种,XML 和 JSON。解析XML格式数据获得与后台交互的信息。
种类:
3种:Pull 解析方式;SAX 解析方式;DOM解析方式。
1.使用Pull解析器解析XML文档
Pull解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如文档开始、文档结束、开始元素和结束元素等。使用parser.next()方法可以进入下一个元素并触发相应的事件。各种事件均已数字的形式被发送,因此可以在程序中使用一个switch语句来对事件进行选择,然后进行相应的事件处理。
1.1事件类型
Pull解析器提供的事件类型总共有5种,分别如下:
(1)START_DOCUMENT 文档开始
(2)START_TAG 开始元素
(3)TEXT 文本
(4)END_TAG 结束元素
(5)END_DOCUMENT 文档结束
1.2常用方法
使用Pull解析器XmlPullParser解析XML文档时,主要会用到以下几个常用方法。
(1)int getAttributeCount(); //获取当前元素的属性个数
(2)String getAttributeValue(int index); //获取属性值
(3)int getEventType(); //获取事件类型
(4)String getName(); //用于START_TAG和END_TAG事件中,获取当前元素的名字
(5)int next(); //处理下一个元素
(6)int nextText(); //用于START_TAG事件中,获得下一个TEXT类型的元素
使用步骤:
1. 先搭建WEB服务器。给定一个XML文件进行测试。
2. 通过XmlPullParserFactory获得XmlPullParser对象进行解析。
3. XmlPullParser对象解析文档。
详细步骤:
1. 先搭建WEB服务器。给定一个XML文件进行测试。
<?xml version="1.0" encoding="UTF-8"?> <Users> <User> <Name>h_bolin</Name> <Pwd>0</Pwd> </User> <User> <Name>h_bolin1</Name> <Pwd>12</Pwd> </User> <User> <Name>h_bolin2</Name> <Pwd>123</Pwd> </User> <User> <Name>h_bolin3</Name> <Pwd>1234</Pwd> </User> <User> <Name>h_bolin4</Name> <Pwd>12345</Pwd> </User> <User> <Name>h_bolin5</Name> <Pwd>123456</Pwd> </User> </Users>
2. 通过XmlPullParserFactory获得XmlPullParser对象进行解析。
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser(); xmlPullParser.setInput(new StringReader(xmlData));
3. XmlPullParser对象解析文档。
int eventType = xmlPullParser.getEventType(); String name = ""; String pwd = ""; while (eventType != XmlPullParser.END_DOCUMENT) { String nodeName = xmlPullParser.getName(); switch (eventType) { case XmlPullParser.START_DOCUMENT: // 文档开始的时可以的操作 break; // 开始解析某个结点 case XmlPullParser.START_TAG: { if ("Name".equals(nodeName)) { name = xmlPullParser.nextText(); } else if ("Pwd".equals(nodeName)) { pwd = xmlPullParser.nextText(); } break; }// 完成解析某个结点 case XmlPullParser.END_TAG: { if ("User".equals(nodeName)) { Log.d("h_bl", "Name is" + name); Log.d("h_bl", "Pwd is " + pwd); users.add(new User(name, pwd)); } break; } default: break; } eventType = xmlPullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
详细代码:
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity implements OnClickListener {
private Button bt_getData;
private TextView tv_show_data;
private List<User> users = new ArrayList<User>(); // 数据解析
private static final int GET_DATA_OK = 0;
// Handler机种更新UI
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case GET_DATA_OK:
for (User user : users) {
tv_show_data.append(user.getName() + "\n");
tv_show_data.append(user.getPwd() + "\n");
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
bt_getData = (Button) findViewById(R.id.bt_getData);
tv_show_data = (TextView) findViewById(R.id.tv_show_data);
bt_getData.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_getData:
getData();
break;
default:
break;
}
}
/**
* 获取数据
*/
private void getData() {
new Thread(new Runnable() {
@Override
public void run() {
Log.d("h_bl", "进入执行");
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://h-bolin.imwork.net/SendXMLData/SendData.xml");
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
Log.d("h_bl", "响应成功");
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
users = parseXMLWithPull(response);
Message message = new Message();
message.what = GET_DATA_OK;
// 将服务器返回的结果存放到Message中
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
Log.d("h_bl", "链接失败");
e.printStackTrace();
} catch (IOException e) {
Log.d("h_bl", "链接IO异常");
e.printStackTrace();
}
}
}).start();
}
/**
* PULL解析XML文件
*/
private List<User> parseXMLWithPull(String xmlData) {
List<User> users = new ArrayList<User>();
try {
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String name = "";
String pwd = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
// 文档开始的时可以的操作
break;
// 开始解析某个结点
case XmlPullParser.START_TAG: {
if ("Name".equals(nodeName)) {
name = xmlPullParser.nextText();
} else if ("Pwd".equals(nodeName)) {
pwd = xmlPullParser.nextText();
}
break;
}// 完成解析某个结点
case XmlPullParser.END_TAG: {
if ("User".equals(nodeName)) {
Log.d("h_bl", "Name is" + name);
Log.d("h_bl", "Pwd is " + pwd);
users.add(new User(name, pwd));
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return users;
}
}
PS.节点区分大小写。
标签:
原文地址:http://www.cnblogs.com/H-BolinBlog/p/5264091.html