安卓解析XML文件之 SAX解析方式。

    通常情况下我们会新建一个类继承自DefaultHandler,并重写父类的五个方法。

下述一个例子作为具体说明

package com.example.thinkpad.http;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;
import javax.xml.parsers.SAXParserFactory;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendRequest=(Button) findViewById(R.id.send_request);
        responseText=(TextView) findViewById(R.id.response_text);
        sendRequest.setOnClickListener(this);
    }
    @Override
    public void onClick(View v){
        if(v.getId()==R.id.send_request){
            sendRequestWithHttpURLConnection();
        }
    }
    private void sendRequestWithHttpURLConnection(){//使用Okhttp框架向服务器请求数据
        //开启线程来发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
             
                try{
                    OkHttpClient client=new OkHttpClient();
                    Request request=new Request.Builder()
                            //指定访问的服务器地址是本机
                    .url("http://10.0.2.2/get_data.xml")
                            .build();
                    Response response=client.newCall(request).execute();
                    String responseData =response.body().string();
                    parseXMLWithSAX(responseData);
                }catch(Exception e){
                    e.printStackTrace();

                }
            }
        }).start();
    }
    private void parseXMLWithSAX(String xmlData){
        try{
            SAXParserFactory factory=SAXParserFactory.newInstance();//获取SAXParserFactory实例 
            XMLReader xmlReader=factory.newSAXParser().getXMLReader();//获取XMLReader实例
            MyHandler handler=new MyHandler() ;实例化MyHandler
            //将ContentHandler的实例设置到XMLReader中
            xmlReader.setContentHandler(handler);
            //开始执行解析
            xmlReader.parse(new InputSource(new StringReader(xmlData)));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package com.example.thinkpad.http;

import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * Created by thinkpad on 2018/5/20.
 */

public class MyHandler extends DefaultHandler {
    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;
    private StringBuilder times;
    @Override
    public void startDocument() throws SAXException{
        id =new StringBuilder();
        name=new StringBuilder();
        version=new StringBuilder();
         times=new StringBuilder("null");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{
        //记录当前节点名
        nodeName=localName;
    }
    @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);
        }else if("times".equals(nodeName)){

            times.append(ch,start,length);
        }
    }
    @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("ContentHanlder","version is "+version.toString().trim());
    Log.d("ContentHanlder","times is "+times.toString().trim());
    //最后要将StringBuilder清空掉
    id.setLength(0);
    name.setLength(0);
    version.setLength(0);
    times.setLength(0);
}
    }
    @Override
    public void endDocument() throws SAXException{
        super.endDocument();
    }
}

备注:Okhttp框架需要在build.gradle中导入库 即是红字语句

hependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
}


猜你喜欢

转载自blog.csdn.net/qq_41105058/article/details/80382699