Android之解析XML格式数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之解析XML格式数据相关的知识,希望对你有一定的参考价值。
作用:在网络上传输数据时最常用的格式有两种,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.节点区分大小写。
以上是关于Android之解析XML格式数据的主要内容,如果未能解决你的问题,请参考以下文章