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 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部分及源码见下一个部分。