android学习笔记16: SAX解析XML

    先看一下要解析的XML文档:

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
<person id="1" sex="m"> 
      <name>zhangsan</name> 
          <age>32</age> 
        <adds> 
            <add code="home">home add</add> 
            <add code="com">com add</add> 
        </adds> 
    </person> 
    <person id="2" sex="w"> 
         <name>lisi</name> 
            <age>22</age> 
        <adds> 
             <add code="home">home add</add> 
             <add code="com">com add</add> 
        </adds> 
    </person> 
</doc>


    SAX解析XML的完整流程 :

1. 编写一个class 继承DefaultHandler  ,重写里面的5个方法  用来解析XML

public class xmlParse extends DefaultHandler {

	private Person person;
	private List<Person> list;
	private String CurrentTag=null;
	private String code;
	
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		// 解析文档前的准备工作
		list = new ArrayList<Person>();
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		for(Person person:list){
			System.out.println(person.toString());
		}
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		 
		super.startElement(uri, localName, qName, attributes);
		// 只要碰到元素节点不管是有属性 没属性 有文本 没文本的  就会调用这个方法。若是碰到了文本节点 就会触发characters()
		if("person".equals(localName)){
			person = new Person();
			person.setID(attributes.getValue(0));
			person.setSex(attributes.getValue("sex"));// attributes.getValue()的两种写法
		}
		else if("add".equals(localName)){
			code = attributes.getValue(0);
		}
		CurrentTag = localName;   // 解析的当前节点
		
		}
		
	

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		
		super.endElement(uri, localName, qName);
		if("person".equals(localName)){
			list.add(person);
			person = null;
		}
		CurrentTag = null;  //节点结束时制空  让它碰到空格的时候就会不调用characters
		code = null;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		 
		super.characters(ch, start, length);
		if(CurrentTag!=null){    //  为null  就说明碰到了空格  当前没有元素
			String content = new String(ch,start,length);
			if("name".equals(CurrentTag)){
				person.setName(content);
			}
			else if("age".equals(CurrentTag)){
				person.setAge(content);
			}
			else if("add".equals(CurrentTag)){
				if("home".equals(code)){
					person.setHome(content);
				}
				else if("com".equals(code)){
					person.setCom(content);
				}
			}
			
	}

}
}


2.  在主程序里面开始解析我们的文档吧:

SAXParserFactory factory = SAXParserFactory.newInstance();  
        SAXParser parser = factory.newSAXParser();  
        SaxParseService handler = new SaxParseService();  
        parser.parse(xmlStream, handler);

其中的xmlStream 可以从网络获取  也可以从assets获取:InputStream is = getAssets().open("test.xml");


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值