Android基础之XML和JSON数据解析

今天就一个字,累!好久没有干这么长时间的活了,不过,也很开心。

今天的学习主要是学习了android中网络编程这一块,学习了发送HTTP请求的方法以及解析

XML和JSON数据的方法,直接上代码,代码上讲解已经很详细了!!!

public class MainActivity extends ActionBarActivity implements OnClickListener{
public static final int SHOW_RESPONSE=0;
private Button  sendRequest;
private TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendRequest=(Button)findViewById(R.id.send_request);
        responseText=(TextView)findViewById(R.id.respond_text);
        sendRequest.setOnClickListener(this);
    }
    //Handler是在主线程中创建,所以会在主线程执行
    //实现了由子线程向主线程的转变,解决了子线程不能更新UI的问题
    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);
break;


default:
break;
}
    }
    };
    public void onClick(View v)
    {
    if(v.getId()==R.id.send_request)
    {
    //使用HttpURLConnection的方法来发送请求
    //sendRequestWithHttpURLConnection();
    //使用HttpClient的方法来发送请求
    sendRequestWithHttpClient();
    }
    }
    //采用HttpClient来发送http请求
     private void sendRequestWithHttpClient()
     {
    new Thread(new Runnable() {

@Override
public void run() {
//由于HttpClient是一个皆苦,所以无法创建它的实例。
//一般都会创建一个DefaultHttpClient
HttpClient httpClient=new DefaultHttpClient();
//发起一条get请求,创建一个HttpGet对象,并传入目标网络地址
//HttpGet httpGet=new HttpGet("http://www.baidu.com");

//Pull方式对XML文件进行解析
//指定访问的服务器地址是电脑本机
HttpGet httpGet=new HttpGet("http://127.0.0.1/get_data.xml");
HttpResponse httpResponse;
try {
//调用execute方法,执行返回一个httpResponse对象,服务器信息都在里面
httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode()==200)
{
//获取服务器返回的状态码,如果等于200就说明请求和响应都成功了
//调用getEntity方法获取一个HttpEntity实例
HttpEntity entity=httpResponse.getEntity();
//将获取的实例转换为字符串
String response=EntityUtils.toString(entity,"utf-8");
//最后通过Message对象传递给Handler来处理
// Message message=new Message();
// message.what=SHOW_RESPONSE;
// message.obj=response.toString();
// handler.sendMessage(message);

parseXMLWithSAX(response);
parseJSONWithJSONObject(response);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}).start();
     }
     
    
    //采用HttpURLConnection的方式来发送Http请求
    private void sendRequestWithHttpURLConnection()
    {
    //开启线程来发起网络请求
    new Thread(new Runnable() {

@Override
public void run() {
//声明对象
HttpURLConnection connection=null;
try {
//创建URL对象,并且传入目标的网络地址
URL url=new URL("http://www.baidu.com");
//通过URL对象的openConnection方法来获的HttpURLConnection对象实例
connection=(HttpURLConnection) url.openConnection();
//设置HTTP请求的方法,设置的方法有两个,一个是GET,表示希望从服务器获取数据
//如果是POST,则是向服务器发送数据
connection.setRequestMethod("GET");
//设置连接超时
connection.setConnectTimeout(8000);
//设置读取超时
connection.setReadTimeout(8000);
//调用getInputStream获得返回服务器返回的输入流
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();
//设置一个ID,用于Handler进行消息判别的一个依据
message.what=SHOW_RESPONSE;
//将服务器返回的结果存放到Message中
message.obj=response.toString();
//将结果发送给在主线程之中的Handler
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally
{
if(connection!=null)
{
connection.disconnect();
}
}

}
}).start();
    }
  //采用SAX方式对从服务器获得的数据进行解析
    private void parseXMLWithSAX(String xmlData)
    {
    SAXParserFactory factory=SAXParserFactory.newInstance();
    try {
    //
XMLReader xmlReader=factory.newSAXParser().getXMLReader();
ContentHandler handler=new ContentHandler();
//最后将我们的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
    //采用Pull的方式对从服务器获得数据进行解析
    private void parseXMLWithPull(String xmlData)
    {
    try {
    //获取一个XmlPullParserFactory实例,借助这个实例
    //获得XmlPullParser对象
XmlPullParserFactory factor=XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser=factor.newPullParser();
//将服务器返回的数据设置进去,为下面的解析做准备
xmlPullParser.setInput(new StringReader(xmlData));
//获取当前的解析事件
int eventType=xmlPullParser.getEventType();
String id= "";
String name="";
String version="";
//如果当前的事件不等于XmlPullParser.END_DOCUMENT,则表示未解析完毕
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("MainActivity","id is"+id);
Log.d("MainActivity","name is"+name);
Log.d("MainActivity","version is"+version);
}
}
default:
break;
}
eventType=xmlPullParser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
    //采用JSONObject的方式来解析JSON格式数据
    /**
     * 这种 方法是将服务器返回的数据传到了一个JSONArray的对象中,然后循环遍历这个JSONArray
     * 从中取出的每一个元素都是一个JSONObject对象,每个对象又包含id、name、version
     * 这些数据,接下来只需要使用getString()方法将数据取出即可。
     * @param jsonData
     */
    private void parseJSONWithJSONObject(String jsonData)
    {
    try {
JSONArray jsonArray=new JSONArray(jsonData);
for (int i=0;i<jsonArray.length();i++)
{
JSONObject jsonObject=jsonArray.getJSONObject(i);
String id=jsonObject.getString("id");
String name=jsonObject.getString("name");
String version=jsonObject.getString("version");
Log.d("MainActivity", "id is"+id);
Log.d("MainActivity", "name is"+name);
Log.d("MainActivity", "version is"+version);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   
    }
}

采用SAX解析时候ContentHandler代码

public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
//获取节点中的内容时候调用
public void characters(char[] ch, int start, int length)
throws SAXException {
//根据当前的节点名判断将内容添加到哪一个StringBuilder对象中
if("id".equals(nodeName))
{
id.append(ch,start,length);
}else if ("name".equals(nodeName)) {
name.append(ch,start,length);
}else if ("version".equals(nodeName)) {
version.append(ch,start,length);
}
}


@Override
//完成整个XML解析的时候调用
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}


@Override
//解析完某个节点的时候调用
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("app".equals(localName))
{
Log.d("ContentHandler","id is"+id.toString().trim());
Log.d("ContentHandler","name is"+name.toString().trim());
Log.d("ContentHandler","version is"+version.toString().trim());
//最后要将StringBuffer清空掉
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}


@Override
//开始解析XM时候调用
public void startDocument() throws SAXException {
//实例化三个对象
id=new StringBuilder();
name=new StringBuilder();
version=new StringBuilder();
}


@Override
//开始解析某个节点时候调用
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//记录当前结点的名称
nodeName=localName;
}


}

明天加油,晚安!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值