Request request = new Request.Builder()
.url("http://10.0.2.2/get_data.xml")
.build();
一般情况下:
电脑本地服务器地址为 http://localhost 或者 http://127.0.0.1
在模拟器里想要访问电脑设置的本地服务器需要访问 http://10.0.2.2
//获取一个XmlPullParserFactory实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//通过XmlPullParserFactory实例获取一个XmlPullParser对象
XmlPullParser xmlPullParser = factory.newPullParser();
//通过setInput方法开始解析
xmlPullParser.setInput(new StringReader(xmlData));
//通过getEventType方法获取到当前的解析事件
int eventType = xmlPullParser.getEventType();
//判断当前的解析事件是不是结束标志
while (eventType != XmlPullParser.END_DOCUMENT) {
//获取当前节点名
String nodeName = xmlPullParser.getName();
//针对当前的解析事件执行不同的操作
switch (eventType) {
case XmlPullParser.START_TAG:
//通过比对节点名获取对应的数据
if ("id".equals(nodeName)) {
id = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)) {
Log.d(TAG, "id is: " + id);
}
break;
default:
break;
}
//获取下一个解析事件
eventType = xmlPullParser.next();
}
SAX解析方式与Pull方式不同,它将具体的步骤分为不同的方法封装成一个类DefaultHandler
。我们需要通过自己新建一个子类来继承它并重写它的五个方法,针对不同的方法在其中书写对应的逻辑处理即可。
方法 | 作用 |
---|---|
startDocument | 开始解析时调用 |
startElement | 开始解析某个节点调用 |
characters | 获取节点内容时调用 |
endElement | 完成解析某个节点 |
endDocument | 完成解析时调用 |
比如这样:
@Override
public void startDocument() throws SAXException {
id = 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 ("id".equals(nodeName)) {
id.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)) {
//通过trim方法删除字符串开头和结尾可能存在的空格(包括连续空格)和制表符
Log.d("MyContentHandler", "id is: " + id.toString().trim());
//清空数据用来进行下一次读取
id.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
}
解析过程:
其过程整体和Pull没有太大区别,区别是在自定义DefaultHandler类后我们不需要在这里书写解析过程了。毕竟已经在自定义DefaultHandler类中书写过了
//获取一个SAXParserFactory对象,通过它获取XMLReader对象
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
//实例化一个自定义DefaultHandler对象
MyContentHandler handler = new MyContentHandler();
//配置xmlReader开始解析数据
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(new StringReader(responseData)));
和XML解析相比,JSON的解析看起来简单很多:
//解析数据
JSONArray jsonArray = new JSONArray(responseData);
//取出数据
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
Log.d(TAG, "json id is " + id);
}
GSON是谷歌提供的一个开源库。
项目主页:GSON
导入GSON:implementation 'com.google.code.gson:gson:2.8.5'
GSON解析方式需要我们将要解析的集合定义成一个类:
public class GsonApp {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
解析:
//获取一个Gson对象
Gson gson = new Gson();
//使用List<>存储通过fromJson方法解析的数据
//第一个参数是要解析的数据,第二个参数是自定义的解析数据集合数据类型
//这里由于是一个List<>列表,所以通过TypeToken<>(){}.getType方法来获取数据类型
List<GsonApp> appList = gson.fromJson(responseData, new TypeToken<List<GsonApp>>() {}.getType());
//显示数据
for (GsonApp app : appList) {
Log.d(TAG, "json id is " + app.getId());
}
fromJson方法的标准使用方法为:
Data data = gson.fromJson(jsonData, Data.class);