SAX和XmlPull解析XML文件

XMLPull解析技术详解及应用实践 XMLPull解析器是一种轻量级、事件驱动的XML解析方式。与SAX(Simple API for XML)解析器类似,它允许开发者以事件的形式处理XML文档。这种解析器在处理大型文件或在资源受限的环境中(例如移动设备)时表现尤为出色。XMLPull解析器通过迭代的方式逐个读取XML文档中的元素、属性和文本,逐个触发事件,而不是一次性读取整个文档到内存中。在"xmlpull-1.1.3.1.jar"版本中,开发者引入了多项关键功能更新。 阅读详情

1、解析XML文件的两种方法

1.1 使用SAX解析XML文件

SAX在Java和Android中都已经集成,不需要再添加jar包。

使用SAX解析XML文件需要继承DefaultHandler类,并实现相应的方法。其中的方法有startDocument()、startElement()、characters()、endElement()、endDocument(),可以根据自己的需要进行实现。

注意:如果SAX在解析XML过程中需要停止解析,需要使用抛出异常才能终止。

方法的执行步骤如下:

<schools><!-- startDocument()->startElement()获得schools-->

  <school><!-- characters()->startElement()获得school -->

    <key>1</key><!--characters()->startElement()获得key->characters()获得1->endElement()获得key-->

    <value>河南大学</value><!--characters()->startElement()获得value->characters()获得”河南大学“->endElement()获得value-->

 </school><!-- characters()->endElement()获得school -->

…………

</schools><!-- characters()->endElement()获得schools->endDocument() -->

 

1.2 使用XmlPull解析XML文件

XmlPull在Android中已经集成,在Java中需要添加kxml.jar和xmlpull.jar的jar包。XmlPull解析的代码比较简单,容易控制停止解析。

XmlPull的jar包,请到git上下载:https://github.com/MasonYyp/XmlPull-s-jar-package

2、源代码

2.1 SAX解析XML的源代码

2.1.1 ParseXmlHandler.java源码

package parseXML;

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

public class ParseXmlHandler extends DefaultHandler{
    private String currentTag = null;
    private String currentKey = null;
    private String currentValue = null;
    
    private String schoolKey = null;
    private String schoolValue = null;
    
    // 初始化要查找的key
    public ParseXmlHandler(String key) {
        this.schoolKey = key;
    }
    
    // 获得学校的名字
    public String getschool() {
        return this.schoolValue;
    }
    
    // 开始读文件
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }

    // 开始读节点
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);

        // 获得当前节点的名字
        this.currentTag = qName;
        // 有的使用的是localName,如果qName是空值的时候,可以试试使用localName
        // this.currentTag = localName;
        
    }
    
    // 读节点中的内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);

        // 获得节点中的值
        String value = new String(ch, start, length).trim();
        if(!value.equals("")) {
            if("key".equals(this.currentTag)) {
                this.currentKey = value;
            }else if("value".equals(this.currentTag)) {
                this.currentValue = value;
            }
        }
        
    }

    // 读节点结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        
        //注意:如果qName是空值时,试试LocalName
        if("school".equals(qName)) {
            if(this.schoolKey.equals(this.currentKey)) {
                this.schoolValue = this.currentValue;
                // 抛出异常,停止查找
                throw new SAXException("停止查找");
            }else {
                // 重置变量
                this.currentTag = null;
                this.currentKey = null;
                this.currentValue = null;
            }
        }
    }
    
    // 结束读文档
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}


2.1.2 ParseXmlUtils.java源码

package parseXML;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

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

public class ParseXmlUtils {
    
    public String getDisease(String key) {
        
        // 初始自定的Handler
        ParseXmlHandler xmlHandler = new ParseXmlHandler(key); 
        
        try {
            // 初始化SAX
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            xmlReader.setContentHandler(xmlHandler);

            // 获得src目录项的文件
            InputStream xmlFile = ParseXmlUtils.class.getClassLoader().getResourceAsStream("./xmlData/school.xml");
            InputSource xmlInput = new InputSource(xmlFile);
            
            // 开始解析xml文件
            xmlReader.parse(xmlInput);
            
        } catch (SAXException e) {
            // 打印抛出的SAXException的异常
            System.out.println(e.getMessage());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return xmlHandler.getschool();
    }
    
    public static void main(String[] args) {
        ParseXmlUtils utils = new ParseXmlUtils();
        // 查找关键字是2的学学校
        System.out.print(utils.getDisease("2"));
    }
}

2.2 XmlPull解析XML的源代码

package parseXMLPull;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class ParseXMLPull {
    
    public String getSchool(String schoolKey) {
        
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser pullParser = factory.newPullParser();
            // 读取XML文件
            InputStream xmlFile = ParseXMLPull.class.getClassLoader().getResourceAsStream("./xmlData/school.xml");
            InputStreamReader xmlReader = new InputStreamReader(xmlFile);
            pullParser.setInput(xmlReader);

            // 获得当前节点的事件类型
            int eventType = pullParser.getEventType();
            
            // 设置当前节点的值
            String currentNodeName = null;
            String currentKey = null;
            String currentValue = null;
            
            // 读取xml文件
            while(eventType != pullParser.END_DOCUMENT) {
                currentNodeName = pullParser.getName();
                
                switch(eventType) {
                
                // 开始解析节点
                case XmlPullParser.START_TAG:{
                    // 获得相应的值
                    if("key".equals(currentNodeName)) {
                        currentKey = pullParser.nextText().trim();
                    }else if("value".equals(currentNodeName)) {
                        currentValue = pullParser.nextText().trim();
                    }
                    
                    break;                    
                }
                
                // 结束解析节点
                case XmlPullParser.END_TAG:{
                    
                    if("school".equals(currentNodeName) && currentKey.equals(schoolKey)) {
                        // Return the school
                        return currentValue;
                    }                    
                    break;                    
                }
                
                // Break current node
                default:
                    break;            
                }
                
                // 继续读取下一节点
                eventType = pullParser.next();
            }            
            
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        return null;        
    }
    
    public static void main(String[] args) {
        ParseXMLPull xmlPull = new ParseXMLPull();
        System.out.println(xmlPull.getSchool("1"));
    }
}
 

2.3 XML文件

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

<schools><!-- startDocument()->startElement()获得schools-->
    <school><!-- characters()->startElement()获得school -->
        <key>1</key><!--characters()->startElement()获得key->characters()获得1->endElement()获得key-->
        <value>河南大学</value><!--characters()->startElement()获得value->characters()获得”河南大学“->endElement()获得value-->
    </school><!-- characters()->endElement()获得school -->
    
    <school>
        <key>2</key>
        <value>河南大学软件学院</value>
    </school>
    
    <school>
        <key>3</key>
        <value>河南大学计算机学院</value>
    </school>

</schools><!-- characters()->endElement()获得schools->endDocument() -->

xmlpull.jar工具包 工具包包括了:xmlpull_1_1_3_4c.jar;xmlpull_1.1.3.1.jar等。可以解析xml,导入时请将xmlpull_1_1_3_4c.jar;xmlpull_1.1.3.1.jar都导入,不然会报错。 立即下载

相关推荐

xmlPull的jar包.zip

在java平台上XmlPull的jar包(kxml2-2.3.0.jar,xmlpull-1.1.3.1.jar)

xmlpull使用笔记

xmlpull介绍 xmlpull是一个基于事件的xml解析框架,官网:http://www.xmlpull.org。 maven仓库 &lt;dependency&gt; &lt;groupId&gt;xmlpull&lt;/groupId&gt; &lt;artifactId&gt;xmlpull&lt;/artifactId&gt; &lt;version&gt...

fim1991的博客 3818

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 573

xml解析数据——XmlPullParser的用法

XmlPullParser解析1、XML对应的实体文件2、XML文件3、Pull解析码 1、XML对应的实体文件 2、XML文件 3、Pull解析码 android可以使用 SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。 下面将介绍下在Android中极力推荐的xmlpull方式解析xml。xmlpull不仅仅可以使用在Android上,同样也适用于javase,但在javase环境下,你需要自己去获取xmlpull所依赖的类库。 pull解析是事件驱动的所以根据

weixin_45552475的博客 6734

4、设备树的处理(1)

其实到第4节才写设备树的问题完全是因为忘记了,之前有一个版本是先关闭了设备树的,习惯性的认为设备树已经处理完了,失误了!!!前文说过,这个系统是依着荣品的开发板和核心板来的,使用的是5.1内核的SDK。它的SDK里是开发板全功能的,所以设备树也是的。

wsen2012的博客 417

基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践

贝叶斯统计学是一门基本思想与传统基于频率思想的统计学完全不同的统计学方法;它以其灵活性和先进性在现代的统计学中占据着重要的地位。贝叶斯统计学是开展科学研究不可缺少的重要手段,但是,因为其思想、技术和方法都与传统统计学有着较大区别;且其计算中涉及马尔科夫、蒙特卡罗和吉布斯采样等现代计算方法,对使用者经验和能力构成了很大的挑战。

AAIshangyanxiu的博客 679

XML PULL解析

Pull和Sax类似,都是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Pull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Pull比Sax更简明,而且不需要扫描完整个流。          他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事

513

OpenPnP/Arduino - 二手西门子电动飞达的通讯协议解析与实战

本文详细解析了二手西门子电动飞达的通讯协议,并通过Arduino控制板实现与开源贴片平台OpenPnP的集成。文章涵盖了硬件接口定义、协议帧结构分析、Arduino控制实战、OpenPnP集成技巧以及二手飞达翻新指南,为开发者提供了全面的技术指导和实战经验。

weixin_30411819的博客 201

android xml文件的解析方法DOM、XmlPull、SAX

1、XML是什么? XML是一种可扩展标记语言,其文档结构被设计成树型结构,主要用于数据信息的描述和存储、携带数据和交换数据,通过XML,可以在不兼容的系统之间交换数据。 2、在Android中怎样解析XML文件 优点 缺点 DOM 1.XML树在内存中完整存储,因此可以直接修改...

wangjippp的博客 184

逆向解析喜马拉雅新版xm-sign算法:从dws.1.6.8.js到签名生成

本文详细解析了喜马拉雅新版xm-sign算法的逆向破解方法。通过定位核心JS文件dws.1.6.8.js,构建本地Node.js模拟执行环境,并解密关键参数cid与appKey,最终实现签名算法的本地化稳定生成,为数据采集提供可靠解决方案。

weixin_29250403的博客 212

【win11 cuda12.0安装tensorflow-gpu】

win11 cuda 12.0 安装 tensorflow-gpu

weixin_36299320的博客 3009

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM、SAX以及XMLpull,这里对它们进行总结。 如果理解有误,欢迎指正   ^_* 一、DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简

Luffy的专栏 3754

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 541

XML之解析(知识详解即基本使用)

总之,XML解析在现代软件开发中扮演着非常重要的角色,能够帮助程序员轻松处理和操作基于XML的数据结构。无论在何种应用场景下,简单且易于理解的XML格式仍然是开发人员最喜欢的数据格式之一。

weixin_74352229的博客 8870

【微服务】Spring Aop原理深入解析

spring原理深度解析

congge 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

XML文件的几种解析方式

1、DOM(文件对象模型) DOM(document object model)是W3C支持的一种XML解析方式。一般Web中XML格式的SOAP消息或者其它文件描述都不大。 DOM是Tree-based解析XML类型。(XML的树模型和事件模型的区别:http://www.saxproject.org/event.html) 将XML文件看做一个DOM树模型,其中有根节点,普通节点,元素等

shiyue0010的专栏 698

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java使用SAX,XmlPull两种方式解析XML

XML(eXtendedMarkupLanguage,可扩展的标记性语言),提供了一个跨平台、跨网络、跨程序的语言的数据描述方式,使用XML可以方便实现数据交换、系统配置等常见功能。 XML与HTML类似,都是属于标记性的语言,都是从SGML(StandardGeneral Markup Language,标准通用语言)发展而来。 其格式如下所示: 1. SAX解析XML文档 SA

x_fei_xia的博客 1240

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

XMLPull读取

XMLPull读取才是最适合安卓的文件读取方式,DOMdu

u014402150的专栏 356

Android解析XML(PULL方式)和JSON 工作原理和实现过程(详细代码)

Json:解析过程和解析原理以及与XML的对比(这里讲的挺详细的:http://blog.youkuaiyun.com/onlyonecoder/article/details/8490924) PULL 的工作原理: XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成End

独自等待 7664

android中用XmlPullParser解析XML文件,以及res/raw和assets的不同

XML:可扩展标记语言读XML,XML文件的解析 三种解析XML的文件的方式1. SAX 事件驱动 不是一次性加载到内存2. DOM 一次加载到内存,性能较差 适合服务器端编程3. XMLPULL 适应嵌入式设备,占用内存较小 API相对简单OpenAPIJSON: 相对于XML格式,更节省空间。1) 大括号开始结束{}2) 内容部分...

weixin_34372728的博客 204

xml文件解析方式详解、 pull方式解析xml文件实现代码

解析xml文件 需求: 读取xml文件中的信息展现到界面上,把获取信息的操作放到一个业务bean类里面 实现步骤: 建立xml文件,粘贴到项目的src目录下,用类加载器去读取xml文件的内容 .几种xml文件解析方式: java web中有2中解析方式 DOM 解析:把文件一次性加载到内存里,生成一个树状结构,在内存中对树状节点进行修改或添加节点 这种方法的缺点: ...

weixin_33972649的博客 136

xml解析 只有节点属性 android,Android开发XML解析方法

XML:可扩展标记语言XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节需要阅读相关的技术文献,这里不做具体的阐述了。XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言)XML是Internet环境中款平台的,依赖于内容技术,是当前处理结构画文档信息的有力工具,可扩展标记语言X...

weixin_42387482的博客 325

Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerces、JAXP等一堆概念,但是很多人总是会弄混他们之间的关系,这对我们理解XML文件的创建和解析很不利。要挑选一个适合在Android平台上使用的XML解析方案,我们还

New Time. New Thinking! 400

Android中的几种解析XML文件的类

ØDOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的. 使用场景:DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节...

weixin_30617737的博客 134
上一篇: Android实现imageView在屏幕中缩放
下一篇: Android中字体大小自适应设备
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值