android pull 解析xml方式

先获取到一个XmlPullParserFactory实例

通过实例得到XmlPullParser对象

调用XmlPullParser的setInput()方法将服务返回的XML数据设置进去开始解析

通过getEventType()可以得到当前的解析事件

While循环不断地进行解析

如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用next()方法后可以获取下一个解析事件.

在while循环中,我们通过getName()方法得到当前结点的名字,如果发现结点名字等于id…等.就调用nextText()方法来获取结点内具体的内容

pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字,

读取到xml的声明返回数字0 START_DOCUMENT;

读取到xml的结束返回数字1 END_DOCUMENT ;

读取到xml的开始标签返回数字2 START_TAG

读取到xml的结束标签返回数字3 END_TAG

读取到xml的文本返回数字4 TEXT

pull是开源的项目 源码下载地址http://www.xmlpull.org/

被解析的xml文档和android
dom 解析xml方式
 中的xml文档一样,命名为pullTest.xml.

package com.jia.networktest;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.StringReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

public static final int SHOW_RESPONSE = 0;

public static final int SHOW_HTTPCLIENT = 1;

private Button send_request;

private TextView responseText;

private Button btn_httpClient;

private Handler handler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case SHOW_RESPONSE:

String response = (String) msg.obj;

// 在这里进行UI操作,将结果显示到界面上

responseText.setText(response);

case SHOW_HTTPCLIENT:

String m_httpClient = (String) msg.obj;

// 在这里进行UI操作,将结果显示到界面上

responseText.setText(m_httpClient);

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

send_request = (Button) findViewById(R.id.send_request);

responseText = (TextView) findViewById(R.id.response);

btn_httpClient = (Button) findViewById(R.id.HttpClient);

send_request.setOnClickListener(this);

btn_httpClient.setOnClickListener(this);

}

@Override

public void onClick(View v) {

if (v.getId() == R.id.send_request) {

sendRequestWithHttpURLConnection();

} else if (v.getId() == R.id.HttpClient) {

sendRequestWithHttpClient();

}

}

private void sendRequestWithHttpClient() {

new Thread(new Runnable() {

@Override

public void run() {

try {

HttpClient httpClient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost(

"http://192.168.1.88:8080/jia/get_data.txt");

List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("username",

"[email protected]"));

params.add(new BasicNameValuePair("password", "yaowentian"));

UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(

params, "utf-8");

httpPost.setEntity(urlEncodedFormEntity);

HttpResponse httpResponse = httpClient.execute(httpPost);

if (httpResponse.getStatusLine().getStatusCode() == 200) {

// 请求和响应都成功了

HttpEntity entity = httpResponse.getEntity();// 获取到一个HttpEntity实例

String response = EntityUtils.toString(entity, "utf-8");// 用EntityUtils.toString()这个方法将HttpEntity转换成字符串

/*

* Message message = new Message(); message.what =

* SHOW_HTTPCLIENT; // 将服务器返回的结果存放到Message中 message.obj

* = response.toString(); handler.sendMessage(message);

*/

parseXMLWithPull(response);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void parseXMLWithPull(String xmlData) {

try {

// 创建一个xmlPullParser的工厂

XmlPullParserFactory factory = XmlPullParserFactory

.newInstance();

// 获取一个解析实例

XmlPullParser xmlPullParser = factory.newPullParser();

xmlPullParser.setInput(new StringReader(xmlData));

// 当前事件的类型

int eventType = xmlPullParser.getEventType();

String id = "";

String name = "";

String version = "";

while (eventType != xmlPullParser.END_DOCUMENT) {

// 当前节点的名称

String nodeName = xmlPullParser.getName();

switch (eventType) {

// 开始解析某个结点

case XmlPullParser.START_TAG: {

if ("id".equals(nodeName)) {

id = xmlPullParser.nextText();

} else if ("name".equals(nodeName)) {

name = xmlPullParser.nextText();

} else if ("version".equals(nodeName)) {

version = xmlPullParser.nextText();

}

break;

}// 完成解析某个结点

case XmlPullParser.END_TAG: {

if ("app".equals(nodeName)) {

Log.d("jia", "id is----------------->" + id);

Log.d("jia", "name is--------------->" + name);

Log.d("jia", "version is------------>"

+ version);

}

break;

}

default:

break;

}

eventType = xmlPullParser.next();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

private void sendRequestWithHttpURLConnection() {

// 开启线程来发起网络请求

new Thread(new Runnable() {

@Override

public void run() {

HttpURLConnection connection = null;

try {

URL url = new URL("http://www.baidu.com");

connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("POST");

connection.setConnectTimeout(8000);

connection.setReadTimeout(8000);

DataOutputStream out = new DataOutputStream(connection

.getOutputStream());

out.writeBytes("[email protected]&password=yaowentian");

InputStream in = connection.getInputStream();

// 下面对获取到的输入流进行读取

BufferedReader reader = new BufferedReader(

new InputStreamReader(in));

StringBuilder response = new StringBuilder();

String line;

while ((line = reader.readLine()) != null) {

response.append(line);

}

Message message = new Message();

message.what = SHOW_RESPONSE;

// 将服务器返回的结果存放到message中

message.obj = response.toString();

handler.sendMessage(message);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (connection != null) {

connection.disconnect();

}

}

}

}).start();

}

}

[html] view
plain
copy

  1. private String pullParseXml(InputStream inputStream) {
  2. String result = "";
  3. //解析全部的xml
  4. boolean isParse = true;
  5. try {
  6. // 创建一个xmlPullParser的工厂
  7. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  8. // 获取一个解析实例
  9. XmlPullParser parse = factory.newPullParser();
  10. // 设置输入流的编码格式
  11. parse.setInput(inputStream, "UTF-8");
  12. // 当前事件的类型
  13. int eventType = parse.getEventType();
  14. while (XmlPullParser.END_DOCUMENT != eventType) {
  15. // 当前节点的名称
  16. String nodeName = parse.getName();
  17. switch (eventType) {
  18. case XmlPullParser.START_TAG:
  19. if ("group".equals(nodeName)) {
  20. // 解析<group>节点中的属性值,getAttributeCount()获取属性的个数
  21. for (int i = 0; i < parse.getAttributeCount(); i++) {
  22. // 属性名称
  23. String groupName = parse.getAttributeName(i);
  24. // 属性名称对应的值
  25. String nameValue = parse.getAttributeValue(i);
  26. result = result + groupName + " = " + nameValue;
  27. }
  28. result += "\n";
  29. } else if ("person".equals(nodeName)) {
  30. String personName = parse.getAttributeValue(0);
  31. String age = parse.getAttributeValue(1);
  32. result = result + "personName = " + personName
  33. + "age =" + age + "\n";
  34. } else if ("chinese".equals(nodeName)) {
  35. //节点对应的文本
  36. String chinese = parse.nextText();
  37. Pattern p = Pattern.compile("\\s*|\t|\r|\n");
  38. Matcher m = p.matcher(chinese);
  39. chinese = m.replaceAll("");
  40. result = result + "chinese = " + chinese;
  41. } else if ("english".equals(nodeName)) {
  42. String english = parse.nextText();
  43. Pattern p = Pattern.compile("\\s*|\t|\r|\n");
  44. Matcher m = p.matcher(english);
  45. english = m.replaceAll("");
  46. result = result + "english = " + english + "\n";
  47. }
  48. break;
  49. case XmlPullParser.END_TAG:
  50. //在解析到一个group节点完成时,退出解析xml文件
  51. //                  if("group".equals(nodeName)){
  52. //                      eventType = XmlPullParser.END_DOCUMENT;
  53. //                      isParse = false;
  54. //                  }
  55. break;
  56. default:
  57. break;
  58. }
  59. //整个xml文件全部解析
  60. if(isParse){
  61. eventType = parse.next();
  62. }
  63. }
  64. } catch (XmlPullParserException e) {
  65. // TODO Auto-generated catch block
  66. e.printStackTrace();
  67. } catch (IOException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. return result;
  72. }

pull和sax不同最主要的体现在pull可以由客户随时终止解析xml.sax解析,只能从文档头一直读到尾,中间不能停止也不能对文件进行修改。直到解析完了整个文档才会返回。

[html] view
plain
copy

  1. //在解析到一个group节点完成时,退出解析xml文件
  2. //                  if("group".equals(nodeName)){
  3. //                      eventType = XmlPullParser.END_DOCUMENT;
  4. //                      isParse = false;
  5. //                  }

只要满足退出解析的条件,只需要设置如下代码即可。

[html] view
plain
copy

  1. eventType = XmlPullParser.END_DOCUMENT;

pull解析方式用到的方法,大部分我都在代码中注释了。

完整项目下载:http://download.csdn.net/detail/nxh_love/3978483

时间: 2024-12-11 15:10:46

android pull 解析xml方式的相关文章

Android——PULL解析XML

简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关知识的阐述. 需求: 在一个Activity中可以动态添加一个学生信息并保存到XML文件. 同时,还可以查看当前的所有学生信息. 相关技术: 线性布局 设置onClick()事件响应函数 添加一个TextView以显示添加的学生信息 清空所有的子元素(列表中所有的学生信息的TextView) PULL创建XM

Android Pull解析XML

在上文中介绍了使用sax方式解析xml,这里介绍下在Android中极力推荐的xmlpull方式解析xml.xmlpull不仅仅可以使用在Android上,同样也适用于javase,但在javase环境下,你需要自己去获取xmlpull所依赖的类库.         环境: kxml2-2.3.0.jar xmlpull_1_1_3_4c.jar 以上两个jar分别从以下网站下载: http://www.xmlpull.org/    xmlpull http://kxml.sourceforg

android pull解析XML文件

package com.example.pullxml; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import or

android pull解析xml最简单的方法

<?xml version="1.0" encoding="utf-8"?> <doc> <news> <title><![CDATA[震荡调整将成下一阶段主旋律]]></title><time><![CDATA[2015-07-15]]></time><img><![CDATA[http://i1.hexunimg.cn/2014-12-0

Android DOM、SAX、Pull解析XML(转)

本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Document Object Model)这种方式解析xml,通过DOM解析xml在j2ee开发中非常的常见,它将整个xml看成是一个树状的结构,在解析的时候,会将整个xml文件加载到我们的内存当中,然后通过DOM提供的API来对我们的xml数据进行解析,这种方式解析xml非常的方便,并且我们可以通过

Android中pull解析XML文件的简单使用

首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐的解析方式 看代码: XML文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>孙洋洋</name

java和android的解析xml的方式

java解析xml经典的有四种方式: 1.dom 2.sax 3.jdom 4.dom4j   个人觉得dom4j好用,但是我只用过jdom. android我知道的用两种方式,sax和pull SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源. Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的

android网络编程之pull解析xml

android网络编程之pull解析xml 除了前面介绍过的SAX以及DOM方法,还可以通过Pull对xml文档进行一个解析.Pull解析器的解析方式与SAX非常相似.它提供了类似的事件,使用parser.next()可以进入下一元素并触发相应事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行选择,然后进行相应的处理,调用parser.nextText()方法可以获取下一个Text类型元素的值. pull解析器特点: *结构简单:一个接口.一个例外.一个工厂就组成了P

Android几种解析XML方式的比较

https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 缺点是不能倒退. 二.使用DOM解析XML DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分.它是