通常情况下我们会新建一个类继承自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'
}