1. 服务器端很简单直接在上次的服务器端代码上的Webcontent添加itcast.xml(在网上找的一个xml)
2.客户端搭建,主要流程如下
非主线程(Thread):使用HttpURLConnection请求服务器端的xml文件流数据,返回后,使用自定义的sax解析该流数据(xml)。
主线程: handler中,更新自定义adapter,最后刷新listView。
首先该xml很简单,有三个标识,id,name,age
使用一个简单的Bean进行封装。
代码如下:
HttpUtils工具类,用于请求流数据,返回一个流数据,方便解析。不多说,前面几个博客有介绍:
- 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 + "]";
- }
- }
parserXMLUtils 类封装了sax解析方法。
- 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;
- }
- }
xmlHandler才是真正的解析类:
- 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;
- }
- }
以上,如果你使用过iOS的xml解析,是不是发觉很类似,iOS是使用delegate来回调,这个是使用接口回调。
- </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;
- }
- }
具体调用和UI部分及源码见下一个部分。