网络上传输数据最常见的两种格式是 XML 和JSON
先来看一下XML文件 如何解析
要解析的文件
Pull 解析方式
//pull解析XML
private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch (eventType){
case XmlPullParser.START_DOCUMENT:
foodList = new ArrayList<>(); // 初始化foodList集合
break;
case XmlPullParser.START_TAG:{
if("food".equals(nodeName)){
food = new Food();
}else if("name".equals(nodeName)){
food.setName(xmlPullParser.nextText());
}else if("price".equals(nodeName)){
food.setPrice(xmlPullParser.nextText());
}else if("description".equals(nodeName)){
food.setDescription(xmlPullParser.nextText());
}else if ("calories".equals(nodeName)){
food.setCalories(Integer.parseInt(xmlPullParser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:{
if ("food".equals(nodeName)){
foodList.add(food);
Log.d("-------MainActivity","\t\tname;"+food.getName() +" \t\t price:"+food.getPrice()+
"\t\tdescription:"+food.getDescription()+"\t\tcalories:"+food.getCalories());
food = null;
}
}
break;
default:
break;
}
// 手动的触发下一个事件
eventType=xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
SAX 解析
//SAX解析XML 需要先 继承 DefaultHandler 重写方法
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder name;
private StringBuilder price;
private StringBuilder description;
private StringBuilder calories;
@Override
public void startDocument() throws SAXException {
name = new StringBuilder();
price = new StringBuilder();
description = new StringBuilder();
calories = 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 {
// 根据当前节点名 判断将内容添加到那个StringBuilder中
if("name".equals(nodeName)){
name.append(ch,start,length);
}else if("price".equals(nodeName)){
price.append(ch,start,length);
}else if("description".equals(nodeName)){
description.append(ch,start,length);
}else if ("calories".equals(nodeName)){
calories.append(ch,start,length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("food".equals(localName)){
Log.d("-------MainActivity","\t\tname;"+name.toString().trim() +" \t\t price:"+price.toString().trim()+
"\t\tdescription:"+description.toString().trim()+"\t\tcalories:"+calories.toString().trim());
//将StringBuilder清空
name.setLength(0);
price.setLength(0);
description.setLength(0);
calories.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
//sax解析XML
private void parseXMLWithSAX(String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将 ContentHandler 的实例设置到 xmlReader
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
http请求 OkHttp 开源项目
https://github.com/EmotionalRonanyg/okhttp
OkHttp 依赖 compile ‘com.squareup.okhttp3:okhttp:3.7.0’
private void sendRequestWithOkHttp() {
//开启线程 发送网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
//OkHttp 开源项目
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.runoob.com/try/xml/simple.xml")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//pull解析XML
parseXMLWithPull(responseData);
//sax解析XML
parseXMLWithSAX(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();//开启线程
}