android开发之sax解析xml文档

             做android开发的掌握一两种解析xml的技术是很重要的,今天和大家分享下,怎么在android中利用SAX解析xml。

      这里不对sax做过多的介绍,推荐读者去查看:点击打开链接。这样我们的内容就变的简单了。

下面先看一下我们要解析的xml文档内容:

<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="001">
<name>ZengZhiyuan</name>
<sex>male</sex>
<age>21</age>
<address>yibin of sichuan</address>
</user>
<user id="002">
<name>LuHongling</name>
<sex>female</sex>
<age>19</age>
<address>luzhou of sichuan</address>
</user>
</users>

我们的Activity类

public class XMLActivity extends Activity {
	private Button saxbutton = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        saxbutton = (Button)findViewById(R.id.saxbutton);
        saxbutton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//这里不对怎么下载做解释,可以去参考我以前的文章
				HttpDownloader http = new HttpDownloader();
				//注意这里不要用localhost或者127.0.0.1,会报错的,因为android里是10.0.2.2
				String txt = http
						.download("http://10.0.2.2:8080/examples/users.xml");
				System.out.println(txt);
				try {
					//创建一个SAXParserFactory
					SAXParserFactory factory = SAXParserFactory.newInstance();
					XMLReader reader = factory.newSAXParser().getXMLReader();
					//为XMLReader设置内容处理器
					reader.setContentHandler(new MyContentHandler());
					//开始解析
					reader.parse(new InputSource(new StringReader(txt)));
				} catch (SAXException e) {
					e.printStackTrace();
				} catch (ParserConfigurationException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		});
    }
}

最后我们继承DefaultHandler的MyContentHandler.java

/**
 * DefaultHandler实现了ContentHandler、DTDHandler、EntityResolver、ErrorHandler
 *
 */
public class MyContentHandler extends DefaultHandler{
	String tagName,name,sex,age,address;
	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始解析xml");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("解析xml完成");
	}
	
	/* uri:xml命名空间的uri
	 * localName:不带前缀的标签名,如:<xs:name id="1">中name
	 * qName:带前缀的标签名,如:上面的xs:name
	 * attributes:标签里面的所有属性如“id="001"”
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		//把正在解析的标签名字付给tagName,方便后面在characters中好判断
		tagName=localName;
		if(localName.equals("user")){
			for(int i=0;i<attributes.getLength();i++){
				System.out.println(attributes.getLocalName(i)+"="+attributes.getValue(i));
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//当结束一个大标签时,我们打印解析到的内容
		if(localName.equals("user")){
			System.out.println("name:"+name);
			System.out.println("sex:"+sex);
			System.out.println("age:"+age);
			System.out.println("address:"+address);
		}
	}

	/* 注意:
	 * 你的xml文件最好不要同回车、制表符等,因为当characters方法遇到这些符号时,
	 * 也会执行,这样就会导致解析到空字符串,带来误解。
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
			if(tagName.equals("name")){
				name = new String(ch,start,length);
			}else if(tagName.equals("sex")){
				sex = new String(ch,start,length);
			}else if(tagName.equals("age")){
				age = new String(ch,start,length);
			}else if(tagName.equals("address")){
				address = new String(ch,start,length);
			}
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值