Android 开发中使用SAX解析xml小结

本文介绍了一个基于SAX的XML解析器实现,通过自定义Handler来处理XML文件中的数据,并提供了封装好的工具类以便于调用。同时展示了如何利用该解析器读取具体的XML内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解析类:

      继承和重写DefaultHandler 。

 

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

 

public class EmployeeHandler extends DefaultHandler {

    private static final String TAG = "xml";
    private List<Employee> data;
    private Employee employee;
    private String preTAG;
    
    private static final String _Employee="Employee";
    private static final String _name="name";
    private static final String _time="SignInTime";
    private static final String _phoneNumber = "phoneNumber";
    
    public EmployeeHandler(List<Employee> data){
        super();
        this.data = data;
    }
    //解析文档头
    @Override
    public void startDocument() throws SAXException {
//新建一个数组链表,元素为对象,用来存放xml解析到得数据
        if(data==null)
            data=new ArrayList<Employee>();
        Log.d(TAG, "startDocument ------- :");
        super.startDocument();
    }
    @Override
    public void endDocument() throws SAXException {
        Log.d(TAG, "endDocument ------- :");
        super.endDocument();
    }
    //文档结束标签
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        Log.d(TAG, "startElement ------- :localName :"+localName);
         preTAG = localName;
        if(_Employee.equalsIgnoreCase(localName)){
//新建用来存储标签之间的值的对象
            employee=new Employee();
        } 
        
        super.startElement(uri, localName, qName, attributes);
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        preTAG = "";
        if(_Employee.equalsIgnoreCase(localName)){
            data.add(employee);
            Log.d(TAG, "endElement ------- :һ ");
        }
        super.endElement(uri, localName, qName);
    }
    //主要解析放在这里
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String info = new String(ch,start,length);  
        Log.d(TAG, "characters ------- : property value :  " +info);
//将标签中之间的值存入对象字段
        if(preTAG.equalsIgnoreCase(_name)){
            employee.setName(info);
        } else if (preTAG.equalsIgnoreCase(_phoneNumber))
        {
        	employee.setPhoneNumber(info);
        }else if(preTAG.equalsIgnoreCase(_time)){
        	employee.setTime(info);
        }
        super.characters(ch, start, length);
    }
    
    public List<Employee> getdata(){
        return data;
    }
}
 
2.EmployeeXmlHelper类:
   封装了解析所需的前置、后置处理逻辑成工具类,方便调用。
 
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

 
public class EmployeeXmlHelper {
	public static List<Employee> parserXML(String str){
		if(null == str){
			return null;
		}
        String _str = str.trim();
        List<Employee> data = new ArrayList<Employee>();
        SAXParserFactory factory=SAXParserFactory.newInstance();
        XMLReader reader;
        try {
        	
        	byte[] bytes = _str.getBytes();
        	ByteArrayInputStream  bis = new ByteArrayInputStream (bytes);
            InputSource is = new InputSource(  (InputStream)bis);
            is.setEncoding("utf-8");
            reader = factory.newSAXParser().getXMLReader();
            reader.setContentHandler(new EmployeeHandler(data));  
            reader.parse(is);  
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return data;
    }
}

3.model类


package com.swift.phoneAttendance.model;


import java.io.Serializable;


public class Employee implements Serializable {
	String name = null;
	String phoneNumber = null;
	String time = null;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhoneNumber() {
		return phoneNumber;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
} 
4.客户端调用方式:
   xml内容如下:
   <<Result>
	<Status>True<Status>
	<Employee>
       <Name></Name>
       <PhoneNumber></PhoneNumber>
     </ Employee>
	<Employee>
</ Result>
   调用解析:
   private List<Employee> data = EmployeeXmlHelper.parserXML(xml);




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值