Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的。常用的就是xml和json了。在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了。安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了:

这个就表示服务器已经运行了,具体的代码都是放在这个/Applications/XAMPP/htdocs目录下的。然后待会儿编写个xml文件也放在这里。 编写个简单的xml文件吧。
2
3
4 25
5
6
7
8
9
10 15
11
12
13
14
</div> 这里为了方便,我在htdocs下面新建了一个test文件夹,然后再新建了一个person.xml文件,习惯了用vim,这里就用vim来实现了一把,保存退出后,我们去看下效果,打开chrome浏览器,输入http://localhost/test/person.xml。发现浏览器如下图所示:
显示的内容就是我们文件的内容,接下去通过app去获取这个信息。
xml解析主要有三种方式,SAX,Pull,Dom。下面就用这几种方法来实现下。
首先是SAX方式,SAX方式主要是两部分组成,一部分是解析器,也就是XMLReader接口,负责读取XML文档,另一部分是事件处理器ContentHandler,负责对发送事件响应和进行XML文档处理。
继承DefaultHandler,并重写5个父类的方法。
1、startDocument方法:开始XML解析的时候调用。
2、startElement方法:开始解析某个节点的时候调用。
3、characters方法:获取节点内容的时候调用。
4、endElement方法:解析完某个节点的时候调用。
5、endDocument方法:完成XML解析时候调用。
先新建类SAXContentHandler类,继承DefaultHandler类,编写代码如下:
package com.jared.emxmlstudy;
import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Created by jared on 16/2/19.
*/
public class SAXContentHandler extends DefaultHandler {
private static final String TAB = "SAXContentHandler";
private String nodeName;
private StringBuffer mName;
private StringBuffer mAge;
private StringBuffer mSex;
private StringBuffer mClass;
@Override
public void startDocument() throws SAXException {
mName = new StringBuffer();
mAge = new StringBuffer();
mSex = new StringBuffer();
mClass = new StringBuffer();
}
@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("name".equals(nodeName)) {
mName.append(ch, start, length);
}else if("age".equals(nodeName)) {
mAge.append(ch, start, length);
} else if("sex".equals(nodeName)) {
mSex.append(ch, start, length);
} else if("class".equals(nodeName)) {
mClass.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("Teacher".equals(localName)) {
Log.d(TAB, "This is Teacher");
Log.d(TAB, "name is:" + mName.toString().trim());
Log.d(TAB, "age is:" + mAge.toString().trim());
Log.d(TAB, "sex is:" + mSex.toString().trim());
Log.d(TAB, "class is:" + mClass.toString().trim());
mName.setLength(0);
mAge.setLength(0);
mSex.setLength(0);
mClass.setLength(0);
} else if("Student".equals(localName)) {
Log.d(TAB, "This is Student");
Log.d(TAB, "name is:" + mName.toString().trim());
Log.d(TAB, "age is:" + mAge.toString().trim());
Log.d(TAB, "sex is:" + mSex.toString().trim());
mName.setLength(0);
mAge.setLength(0);
mSex.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
}
}
这里要使用三种方法,所以修改布局如下:
<!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="10dp" tools:context="com.jared.emxmlstudy.MainActivity"><button android:id="@+id/getXmlsax" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="SAX方式获取"></button><button android:id="@+id/getXmlpull" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Pull方式获取"></button><button android:id="@+id/getXmldom" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Dom方式获取"></button></linearlayout>
然后MainActivity中添加代码如下;
package com.jared.emxmlstudy;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import cz.msebera.android.httpclient.Header;
public class MainActivity extends AppCompatActivity {
private static final String xmlUrl = "http://192.168.1.102/test/person.xml";
private Button mGetXmlSax;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGetXmlSax = (Button)findViewById(R.id.getXmlsax);
mGetXmlSax.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.getXmlsax:
sendRequestWithAsyncHttpClient(xmlUrl);
break;
default:
break;
}
}
}
private void sendRequestWithAsyncHttpClient(String url) {
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, Header[] headers, byte[] bytes) {
try {
String response = new String(bytes, 0, bytes.length, "utf-8");
parseXMLWithSax(response);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int i, Header[] heade

