Android使用SAX解析xml

简介: 一、理论准备     SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始、元素开始、文本、元素结束、文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事件,以此来获取XML文档里的信息。

一、理论准备

    SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始、元素开始、文本、元素结束、文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事件,以此来获取XML文档里的信息。

    DOM标准简单易用,但是它需要一次性地读取整个XML文档,而且在程序运行期间,整个DOM树常驻内存,导致系统开销过大。SAX解析方式占用内存小,处理速度更快。
    由于DOM一次性将整个XML文档全部读入内存,因此可以随机访问XML文档的每个元素。SAX采用顺序模式来依次读取XML文档,因此无法做到随机访问XML文档的任意元素。

二、项目结构

              image框住的是本实例需要的代码。

三、实例实现

<?xml version="1.0" encoding="UTF-8"?>
Jack24Tom25Bob22

    ps:不知道为啥,用xml格式发布就出问题,用java就不出问题~~愤怒

package xml;

import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxService {
	public static List readXML(InputStream inputStream) throws Exception {
		SAXParserFactory spf = SAXParserFactory.newInstance();        //创建SAXParserFactory对象(SAX解析器工厂)
		SAXParser saxParser = spf.newSAXParser();    //创建SAXParser对象(SAX解析器)
		MyDefaultHandle myDefaultHandle = new MyDefaultHandle();    //MyDefaultHandle对象,继承自DefaultHandle类
		saxParser.parse(inputStream, myDefaultHandle);        //解析XML文档(以InputStream对象的形式)
		inputStream.close();                    //关闭InputStream对象
		return myDefaultHandle.getPersonList();    //返回XML文档中的数据列表
	}
}

package xml;

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

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

public class MyDefaultHandle extends DefaultHandler {
    private Person person = null;                //存储解析得到的单个Person对象
    private List personList = null;      //存储解析得到的所有Person对象
    private String currentTag = null;            //正在解析的元素的标签
    
    private static final String TAG = "MyDefaultHandle";        //Log标签

    public List getPersonList() {
        return personList;
    }

    public void startDocument() throws SAXException {
        personList = new ArrayList();
       System.out.println("开始解析");
    }
    
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if(qName.equals("person")) {                //当遇到标签时,创建一个Person对象
            person = new Person();    
            if(attributes!=null) {
            	person.setId(Integer.parseInt(attributes.getValue(0)));//将读到的id属性值存入Person对象
            }
            System.out.println("处理标签");
        }
        
        currentTag = qName;                        //设置当前读到的标签
    }
    
    public void characters(char[] ch, int start, int length)    throws SAXException {
    	String currentValues = new String(ch, start, length); //获取当前标签里的内容
    	if(currentTag != null) {
            if(currentTag.equals("name")) {    //将读到的name属性值存入Person对象
                person.setName(currentValues);
            }else if(currentTag.equals("age")) {        //将读到的age属性值存入Person对象
                person.setAge(Integer.parseInt(currentValues));
            }
            System.out.println("处理元素");
        }
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
    	//当读到标签时,向列表中添加读取到的单个Person对象
        if(qName.equals("person") && (person != null)) {        
            personList.add(person);
            person = null;
            System.out.println("添加一个person");
        }
        currentTag = null;
    }

    public void endDocument() throws SAXException {
        System.out.println("完毕");
    }

}

package xml;

public class Person { 
	private String name;
	private int age;
	private int id;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

     不知道咋回事Test类就是插不进去,显示一半,气死了。。直接看吧

package xml;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class Test {
    static String URL_PATH = "
http://localhost:8080/TestGet/person.xml";
   
    public static InputStream getInputStream() throws IOException {
        InputStream inputStream = null;
        HttpURLConnection httpURLConnection = null;
        try {
            URL url = new URL(URL_PATH);
            if (url != null) {
                httpURLConnection = (HttpURLConnection) url.openConnection();
                // 设置连接网络的超时时间
                httpURLConnection.setConnectTimeout(3000);
                httpURLConnection.setDoInput(true);
                // 设置本次http请求使用get方式请求
                httpURLConnection.setRequestMethod("GET");
                int responseCode = httpURLConnection.getResponseCode();
                if (responseCode == 200) {
                    // 从服务器获得一个输入流
                    inputStream = httpURLConnection.getInputStream();
                }
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        return inputStream;
    }
    public static void main(String[] args) throws IOException, Exception {
        // TODO Auto-generated method stub
        if(getInputStream()==null) {
            System.out.println("读取失败");
            return ;
        }
        List<Person> person = SaxService.readXML(getInputStream());
        System.out.println(person.size());
        for(int i=0; i<person.size(); i++)
            System.out.println("id:"+person.get(i).getId()+"age:"+person.get(i).getAge()
                    +"name:"+person.get(i).getName());
    }

}


    结果如下:

开始解析
处理元素
处理标签
处理元素
处理元素
处理元素
添加一个person
处理标签
处理元素
处理元素
处理元素
添加一个person
处理标签
处理元素
处理元素
处理元素
添加一个person
完毕
3
id:1age:24name:Jack
id:2age:25name:Tom
id:3age:22name:Bob

四、遗留问题

    1.sax解析中Name和localName什么区别,想到这个是因为一哥们用的localName和person判断他表示结果对了,费解???

    2.endElement的if里把person设置为null是为了防止重复触发该事件,之后把currentTag设置为null是何意?莫非存在如下情况,费解啊。。。

                       image

目录
相关文章
|
4月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
364 1
|
1月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
70 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
4月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
119 15
|
4月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
7月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
7月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
8月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
2月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
9月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
196 1
|
11月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)