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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 1. 解析类:       继承和重写DefaultHandler 。 import java.util.ArrayList;import java.util.List;import org.

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);


相关文章
|
3天前
|
XML 缓存 JavaScript
优化Java中的XML解析性能
优化Java中的XML解析性能
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器将XML转换为JavaScript对象,允许遍历、访问和修改文档。浏览器内置XML解析器,如XMLHttpRequest用于加载XML文档。
|
2天前
|
安全 编译器 测试技术
PHP 8新特性深度解析及其对现代Web开发的影响
本文旨在深入探讨PHP 8的新增特性及其在现代Web开发中的应用与影响。通过分析PHP 8引入的类型系统、性能改进、语言结构更新等关键变化,文章将展示这些新特性如何提升代码质量、加快执行速度,以及简化开发流程。引用权威数据和案例研究,结合科学方法论,本文将论证PHP 8为开发者带来的具体益处,并预测其对未来Web技术趋势的潜在影响。
|
3天前
|
自然语言处理 Java 测试技术
Java中的行为驱动开发(BDD)方法论解析
Java中的行为驱动开发(BDD)方法论解析
|
3天前
|
XML JavaScript Java
解析XML文件的几种方法
解析XML文件的几种方法
|
13天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
|
15天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3
|
1天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
10 3
|
7天前
|
Java 数据库连接 Spring
Spring 整合 MyBatis 底层源码解析
Spring 整合 MyBatis 底层源码解析
|
7天前
|
NoSQL Java Redis
【源码解析】自动配置的这些细节都不知道,别说你会 springboot
【源码解析】自动配置的这些细节都不知道,别说你会 springboot

推荐镜像

更多