1. 服务器端很简单直接在上次的服务器端代码上的Webcontent添加itcast.xml(在网上找的一个xml)
2.客户端搭建,主要流程如下
非主线程(Thread):使用HttpURLConnection请求服务器端的xml文件流数据,返回后,使用自定义的sax解析该流数据(xml)。
主线程: handler中,更新自定义adapter,最后刷新listView。
首先该xml很简单,有三个标识,id,name,age
使用一个简单的Bean进行封装。
代码如下:
public class Person {
private String id;//id
private int age;//年龄
private String name;//姓名
public Person() {
// TODO Auto-generated constructor stub
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String id, int age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
}
@Override
public String toString() { //便于测试
return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
}
}
HttpUtils工具类,用于请求流数据,返回一个流数据,方便解析。不多说,前面几个博客有介绍:
public class HttpUtils {
private static final String path="http://192.168.0.179:8080/Myweb/itcast.xml";
public HttpUtils() {
// TODO Auto-generated constructor stub
}
public static InputStream getXML()
{
InputStream inputStream=null;
try {
URL url=new URL(path);
if(url!=null)
{
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("GET");
int code=connection.getResponseCode();
if(code==200)
{
inputStream=connection.getInputStream();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
}
parserXMLUtils 类封装了sax解析方法。
public class parserXMLUtils {
public parserXMLUtils() {
}
public static List<Person> XMLParser(InputStream in, String nodename) {
SAXParserFactory spf= SAXParserFactory.newInstance();//获取一个工厂实例
try {
SAXParser parser=spf.newSAXParser();//创建SAXParser
//真正的解析类,xmlHandler
xmlHandler handler=new xmlHandler(nodename);
//解析
parser.parse(in, handler);
in.close();
return handler.getList();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
xmlHandler才是真正的解析类:
</pre><pre name="code" class="java">public class xmlHandler extends DefaultHandler {
private List<Person>list=null;
private Person person=null;
private String curTag=null;
private String curValueString=null;
private String nodeName=null;
private static final String TAG="xmlHandler";
public xmlHandler(String NodeName) {
this.nodeName=NodeName;
}
//开始解析文档
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
list=new ArrayList<Person>();
super.startDocument();
}
//第一个元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals(nodeName)) {
person=new Person();
Log.d(TAG, qName);
}
if((attributes!=null)&&person!=null)
{
for(int i=0;i<attributes.getLength();i++)
{
if(attributes.getQName(i).equals("id"))
{
Log.d(TAG, attributes.getValue(i));
person.setId(attributes.getValue(i));
}
}
}
curTag=qName;
}
//每一个元素的属性
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if((curTag!=null)&&(person!=null))
{
curValueString=new String(ch,start,length);
Log.d(TAG, curValueString);
if((curValueString!=null)&&(curValueString.trim()!="")&&(curValueString.trim()!="\n")){
Log.d(TAG, curValueString);
if(curTag.equals("age"))
{
int year=Integer.parseInt(curValueString);
person.setAge(year);
}
else if(curTag.equals("name"))
{
person.setName(curValueString);
}
}
curTag=null;
curValueString=null;
}
}
//一个元素解析完成
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals(nodeName)&&(person!=null))
{
list.add(person);
person=null;
}
super.endElement(uri, localName, qName);
};
public List<Person> getList() {
return list;
}
}
以上,如果你使用过iOS的xml解析,是不是发觉很类似,iOS是使用delegate来回调,这个是使用接口回调。
具体调用和UI部分及源码见下一个部分。