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

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

时间: 2024-10-08 00:44:20

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

基于sax的xml解析 含源码 UI类(二)

本节为UI部分,顺带简单的使用Thread+handler 布局类:只有两个xml文件 activity_main:主布局,仅仅只有一个listView不在给出. item.xml使用的是相对布局,用来显示listView的各项. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与IXMLDOMElement接口有何联系.区别 节点如果是数组,怎么操作? 如何为属性插入属性 字符串的转换与输出 主要代码 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常

微信公众平台开发-access_token获取及应用(含源码)

微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或者禁止公众平台进行当前的操作. 一.access_token作用及使用场景 (一)access_token的作用 access_token由公众号的AppID和AppSecret组成,所以具有识别公众号的作用. (二)access_token的使用场景

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前

17+个ASP.NET MVC扩展点,含源码{转}

1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpModule中,可以将一个方法注册到HttpApplication的任意一个事件中,在之后执行HttpApplication一些列事件时,按照事件的顺序(事件又按照添加方法先后的顺序)执行注册在事件中的方法! namespace MvcStore.Models { public class Excute

HtmlAgilityPack --解析Html源码

最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下. 1. HtmlAgilityPack使用的是XPath进行路径搜索,如果对XML路径搜索很熟悉,用起来会得心应手 <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book

C语言解析JSON源码

2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格,因为它更符合我们的思维习惯,同样一份数据,JSON 格式的就是比 XML 要清晰明了一些. 最近笔者需要在 C语言 上解析 JSON 格式,在网上一顿找,找到一份很不错的开源代码.经过一阵研究与修改以后,终于变成了让笔者用的很顺手的 C语言 版 JSON 解析器. 现将这份经笔者小小修改过的代码记录

GlusterFS源码解析 —— GlusterFS 源码安装

安装环境: CentOS6.2 glusterfs-3.4.3 GlusterFS 挂载需要 fuse 支持,如果你的内核版本低于 2.6.16 则需要下载fuse的源码包自行编译安装,也可下载 fuse 的rpm包.安装fuse的方法我就不说了,不会源码安装的直接去rpmfind.net上下载rpm即可.高于此版本的内核中已经有了fuse.ko的模块,需要的时候可以执行以下命令进行加载: modprobe -b fuse 1.下载GlusterFS的源码包,目前已经有更新版本 : wget h

c++实现游戏开发中常用的对象池(含源码)

c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前使用量 5.最大使用量 http://download.csdn.net/download/little_stupid_child/9730912