您的位置:首页 > 其它

基于sax的xml解析 含源码 各种工具类(一)

2015-04-22 13:14 375 查看
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部分及源码见下一个部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: