根据Mars老师的视频做的实验。
总结两点:
1.注册权限。
<uses-permission android:name="android.permission.internet"/>
2.从服务器读取文件时,一定要new Thread类,查了资料,是说为了主线程的安全,这样操作之后,读取文件异常时,主线程不会崩溃。
import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.party90.utils.HttpDownLoader;
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread() {
public void run() {
HttpDownLoader downloader = new HttpDownLoader();
String str = downloader
.downLoad("http://192.168.1.16:8080/test/saxxml.xml");
try {
SAXParserFactory factory = SAXParserFactory
.newInstance();
XMLReader reader = factory.newSAXParser()
.getXMLReader();
reader.setContentHandler(new MyContentHandler());
reader.parse(new InputSource(new StringReader(str)));
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
});
}
}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
public class MyContentHandler extends DefaultHandler {
private String name,age,sex,status,money;
private String tagName;
@Override
public void startDocument() throws SAXException {
Log.v("vv", "startDocument");
}
@Override
public void endDocument() throws SAXException {
Log.v("vv", "endDocument");
}
/**
* uri 指的是命名空间,为了防止重名。
* 例如:<manifest xmlns:android="http://schemas.android.com/apk/res/android"
* 这段代码中的xmlns指的就是命名空间。
* localName 不包含前缀
* qname 带前缀
* <abc:name>张三</abc:name> 前缀 abc
* 所以 localname 指的是 name
* qName 指的是 abc:name
* attributes
* 例XML为 <worker id="ad01">
* 指的是id或者其他的属性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = localName;
if (localName.equals("worker")) {
for (int i = 0; i < attributes.getLength(); i++) {
Log.v("vv", "attr.getLocalName="+attributes.getLocalName(i)+"attr.getValue"+attributes.getValue(i));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("worker")) {
this.printout();
}
}
/**
* 主要用来得到标签中的内容
* ch char类型的数组 放入标签中的内容
* start 数组开始位置
* length 长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (tagName.equals("name")) {
name = new String(ch,start,length);
}else if (tagName.equals("age")) {
age = new String(ch,start,length);
}else if (tagName.equals("sex")) {
sex = new String(ch,start,length);
}else if (tagName.equals("status")) {
status = new String(ch,start,length);
}else if (tagName.equals("money")) {
money = new String(ch,start,length);
}
}
private void printout() {
Log.v("vv", "name" +name);
Log.v("vv", "age" +age);
Log.v("vv", "sex" +sex);
Log.v("vv", "status" +status);
Log.v("vv", "money" +money);
}
}