使用开源框库AsyncHttpClient
1、在app的build.gradle中的dependencies中添加:
compile 'net.callumtaylor:asynchttpclient:1.5'
2、如果出现错误的话,有几种情况,一种是
这种情况,在app的build.gradle中添加:
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
如果是
这种属于本机没有安装sdk 19,去sdk Manager去下载
3、AsyncHttpClient本身有访问图片、json等的封装好的方法,访问xml页面的话等同于访问一个文本界面,使用StringResponseHandler
,getContent()
返回的就是这个xml文本
访问及xml解析
访问一个天气预报的界面,Log打印相关信息
北京天气预报
public class MainActivity extends AppCompatActivity {
private String response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncHttpClient asyncHttpClient = new AsyncHttpClient("http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100");
asyncHttpClient.get(new StringResponseHandler() {
@Override
public void onSuccess() {
response = getContent();
}
});
findViewById(R.id.btnPull).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
parseXmlWithPull(response);
}
});
findViewById(R.id.btnSAX).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
parseXmlWithSAX(response);
}
});
}
/**
* pull解析
* @param response
*/
private void parseXmlWithPull(String response) {
try {
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new StringReader(response));
int eventType = xmlPullParser.getEventType();
String date = "";
String high = "";
String low = "";
String type = "";
String fengxiang = "";
String fengli = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("date".equals(nodeName)) {
date = xmlPullParser.nextText();
}
if ("high".equals(nodeName)) {
high = xmlPullParser.nextText();
}
if ("low".equals(nodeName)) {
low = xmlPullParser.nextText();
}
if ("type".equals(nodeName)) {
type = xmlPullParser.nextText();
}
if ("fengxiang".equals(nodeName)) {
fengxiang = xmlPullParser.nextText();
}
if ("fengli".equals(nodeName)) {
fengli = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("weather".equals(nodeName)) {
Log.d("jackie", "date:----------------" + date);
Log.d("jackie", "high:----------------" + high);
Log.d("jackie", "low:-----------------" + low);
Log.d("jackie", "type:-----------------" + type);
Log.d("jackie", "fengxiang:-----------------" + fengxiang);
Log.d("jackie", "fengli:-----------------" + fengli);
}
break;
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* SAX解析,需要用到自定义的WeatherHandler
* @param response
*/
private void parseXmlWithSAX(String response) {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
WeatherHandler weatherHandler = new WeatherHandler();
xmlReader.setContentHandler(weatherHandler);
xmlReader.parse(new InputSource(new StringReader(response)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Created by Law on 2015/11/27.
*/
public class WeatherHandler extends DefaultHandler {
private String nodeName;
private StringBuilder date;
private StringBuilder high;
private StringBuilder low;
private StringBuilder type;
private StringBuilder fengxiang;
private StringBuilder fengli;
@Override
public void startDocument() throws SAXException {
date = new StringBuilder();
high = new StringBuilder();
low = new StringBuilder();
type = new StringBuilder();
fengxiang = new StringBuilder();
fengli = new StringBuilder();
}
@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 {
if (nodeName.equals("date")) {
date.append(ch, start, length);
}
if (nodeName.equals("high")) {
high.append(ch, start, length);
}
if (nodeName.equals("low")) {
low.append(ch, start, length);
}
if (nodeName.equals("type")) {
type.append(ch, start, length);
}
if (nodeName.equals("fengxiang")) {
fengxiang.append(ch, start, length);
}
if (nodeName.equals("fengli")) {
fengli.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("weather".equals(localName)) {
Log.d("jackie", "date:----------------" + date.toString().trim());
Log.d("jackie", "high:----------------" + high.toString().trim());
Log.d("jackie", "low:-----------------" + low.toString().trim());
Log.d("jackie", "type:-----------------" + type.toString().trim());
Log.d("jackie", "fengxiang:-----------------" + fengxiang.toString().trim());
Log.d("jackie", "fengli:-----------------" + fengli.toString().trim());
//最后清空StringBuilder
date.setLength(0);
high.setLength(0);
low.setLength(0);
type.setLength(0);
fengxiang.setLength(0);
fengli.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}