android解析XML的三种方式(DOM,SAX,PULL)

Android之解析XML总结(SAX、Pull、Dom三种方式) 常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。          今天解析的xml示例(channels.xml)如下: 百度 腾讯 新浪 淘宝 一、使用sax方式解析  基础知识:      这种方式解析是一种基于事件驱 阅读详情
本文的内容基本上是来自于另一篇文章,详细的请参考:
http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html
然后自己简单的总结了一下,手动写了个demo来练手,把三种方式都写在一个类里面

1. DOM
DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理效率方面就相对差了,当然这是对于其他方式处理xml文档而言。

2. SAX
SAX是基于事件驱动的。当然android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。

既然涉及到事件,就有事件源,事件处理器。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法 来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以 及EntityResolver这4个接口

需要XmlReader 以及DefaultHandler来配合解析xml。

3.PULL

PULL方式也是基于事件驱动的,读取xml回调方法返回的是数字。

读取到xml的声明返回      START_DOCUMENT
读取到xml的结束返回       END_DOCUMENT 
读取到xml的开始标签返回 START_TAG 
读取到xml的结束标签返回 END_TAG 
读取到xml的文本返回       TEXT


package per.lx.xml_parser;  

import java.io.IOException;  
import java.io.InputStream;  
import java.io.Serializable;  
import java.util.ArrayList;  
import java.util.List; 

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.ParserConfigurationException;  
import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.SAXParserFactory;  
  
import org.w3c.dom.Element;  
import org.w3c.dom.NodeList;  
import org.xml.sax.Attributes;  
import org.xml.sax.InputSource;  
import org.xml.sax.SAXException;  
import org.xml.sax.XMLReader;  
import org.xml.sax.helpers.DefaultHandler;  
import org.xmlpull.v1.XmlPullParser;  
import org.xmlpull.v1.XmlPullParserException;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Xml;  
import android.widget.TextView;  
  
public class XMLParserTestActivity extends Activity {  
  
    private static final String DOM = "DOM parser";  
    private static final String SAX = "SAX parser";  
    private static final String PULL = "PULL parser";  
  
    private String parserType = DOM;  
  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
  
        List<SearchInfo> infos = null;  
        if (DOM.equals(parserType)) {  
            infos = parserByDOM("search.xml");  
        } else if (SAX.equals(parserType)) {  
            infos = parserBySAX("search.xml");  
        } else if (PULL.equals(parserType)) {  
            infos = parserByPULL("search.xml");  
        }  
  
        TextView search = (TextView) findViewById(R.id.search);  
        StringBuilder infoBuilder = new StringBuilder();  
        infoBuilder.append(" " + parserType + "\n\n");  
        for (int i = 0; i < infos.size(); i++) {  
            infoBuilder.append(" name : " + infos.get(i).getName() + "\n");  
            infoBuilder.append(" age : " + infos.get(i).getAge() + "\n");  
            infoBuilder.append(" introduction : " + infos.get(i).getIntroduction() + "\n");  
            infoBuilder.append(" url : " + infos.get(i).getUrl() + "\n");  
            infoBuilder.append("\n");  
        }  
        search.setText(infoBuilder.toString());  
    }  
  
    public static class SearchInfo implements Serializable {  
  
        /** 
         *  
         */  
        private static final long serialVersionUID = 1L;  
  
        private String name;  
  
        private int age;  
  
        private String introduction;  
  
        private String url;  
  
        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;  
        }  
  
        public String getIntroduction() {  
            return introduction;  
        }  
  
        public void setIntroduction(String introduction) {  
            this.introduction = introduction;  
        }  
  
        public String getUrl() {  
            return url;  
        }  
  
        public void setUrl(String url) {  
            this.url = url;  
        }  
  
    }  
  
    private static final String SEARCH = "search";  
    private static final String NAME = "name";  
    private static final String AGE = "age";  
    private static final String INTRODUCTION = "introduction";  
    private static final String URL = "url";  
  
    /** 
     * DOM parse 
     *  
     * @param fileName 
     * @return 
     */  
    private List<SearchInfo> parserByDOM(String fileName) {  
        List<SearchInfo> infos = new ArrayList<SearchInfo>();  
        try {  
            // 加载xml文档  
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
            InputStream inputStream = getResources().getAssets().open(fileName);  
            // 找到根节点---searchs  
            NodeList nodes = builder.parse(inputStream).getDocumentElement().getElementsByTagName(SEARCH);  
            // 遍历根节点searchs下的所有子节点  
            for (int i = 0; i < nodes.getLength(); i++) {  
                SearchInfo info = new SearchInfo();  
                Element searchElement = (Element) nodes.item(i);  
                info.setName(searchElement.getAttribute(NAME));  
                info.setAge(Integer.parseInt(searchElement.getAttribute(AGE)));  
                Element introduction = (Element) searchElement.getElementsByTagName(INTRODUCTION).item(0);  
                info.setIntroduction(introduction.getFirstChild().getNodeValue());  
                Element url = (Element) searchElement.getElementsByTagName(URL).item(0);  
                info.setUrl(url.getFirstChild().getNodeValue());  
                infos.add(info);  
            }  
        } catch (ParserConfigurationException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (SAXException e) {  
            e.printStackTrace();  
        }  
        return infos;  
    }  
  
    /** 
     * SAX parse 
     *  
     * @param fileName 
     * @return 
     */  
    private List<SearchInfo> parserBySAX(String fileName) {  
        List<SearchInfo> infos = null;  
        try {  
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();  
            XMLReader reader = parser.getXMLReader();  
            SearchHander hander = new SearchHander();  
            reader.setContentHandler(hander);  
            reader.parse(new InputSource(getAssets().open(fileName)));  
            infos = hander.getSearchInfos();  
        } catch (ParserConfigurationException e) {  
            e.printStackTrace();  
        } catch (SAXException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return infos;  
    }  
  
    private class SearchHander extends DefaultHandler {  
  
        private SearchInfo info;  
        private List<SearchInfo> infos = new ArrayList<SearchInfo>();  
  
        private boolean isIntroduction = false;  
        private boolean isURL = false;  
  
        public List<SearchInfo> getSearchInfos() {  
            return infos;  
        }  
  
        // 开始读取标签  
        public void startElement(String uri, String localName, String qName, Attributes attributes) {  
            String tagName = localName.length() != 0 ? localName : qName;  
            tagName = tagName.toLowerCase().trim();  
            // 读取的是Search标签开始,则实例化SearchInfo  
            if (tagName.equals(SEARCH)) {  
                info = new SearchInfo();  
                info.setName(attributes.getValue(NAME));  
                info.setAge(Integer.parseInt(attributes.getValue(AGE)));  
            }  
            // 读取其他节点  
            if (tagName.equals(INTRODUCTION)) {  
                isIntroduction = true;  
            } else if (tagName.equals(URL)) {  
                isURL = true;  
            }  
        }  
  
        // 结束标签  
        public void endElement(String uri, String localName, String qName) {  
            String tagName = localName.length() != 0 ? localName : qName;  
            tagName = tagName.toLowerCase().trim();  
  
            // 读取的是Search标签结束,则把search添加进集合中  
            if (tagName.equals(SEARCH)) {  
                infos.add(info);  
            }  
            // 读取其他节点  
            if (tagName.equals(INTRODUCTION)) {  
                isIntroduction = false;  
            } else if (tagName.equals(URL)) {  
                isURL = false;  
            }  
        }  
  
        // 读取到节点内容时的回调  
        public void characters(char[] ch, int start, int length) {  
            if (isIntroduction) {  
                info.setIntroduction(new String(ch, start, length));  
            } else if (isURL) {  
                info.setUrl(new String(ch, start, length));  
            }  
        }  
  
    }  
  
    /** 
     * Pull parse 
     *  
     * @param fileName 
     * @return 
     */  
    private List<SearchInfo> parserByPULL(String fileName) {  
        List<SearchInfo> infos = new ArrayList<SearchInfo>();  
        XmlPullParser xmlParser = Xml.newPullParser();  
        InputStream inputStream = null;  
        try {  
            inputStream = getResources().getAssets().open(fileName);  
            xmlParser.setInput(inputStream, "utf-8");  
            int evtType = xmlParser.getEventType();  
            SearchInfo info = null;  
            while (evtType != XmlPullParser.END_DOCUMENT) {  
                switch (evtType) {  
                case XmlPullParser.START_TAG:  
                    String tag = xmlParser.getName();  
                    // 如果是search标签开始,则实例化对象  
                    if (tag.equalsIgnoreCase(SEARCH)) {  
                        info = new SearchInfo();  
                        // 取出search标签中的属性值  
                        info.setName(xmlParser.getAttributeValue(null, NAME));  
                        info.setAge(Integer.parseInt(xmlParser.getAttributeValue(null, AGE)));  
                    } else if (info != null) {  
                        if (tag.equalsIgnoreCase(INTRODUCTION)) {  
                            info.setIntroduction(xmlParser.nextText());  
                        } else if (tag.equalsIgnoreCase(URL)) {  
                            info.setUrl(xmlParser.nextText());  
                        }  
                    }  
                    break;  
                case XmlPullParser.END_TAG:  
                    // 如果遇到search标签结束,则把search对象添加进集合中  
                    if (xmlParser.getName().equalsIgnoreCase(SEARCH) && info != null) {  
                        infos.add(info);  
                        info = null;  
                    }  
                    break;  
                default:  
                    break;  
                }  
                // 如果xml没有结束,则导航到下一个river节点  
                evtType = xmlParser.next();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (XmlPullParserException e) {  
            e.printStackTrace();  
        }  
        return infos;  
    }  
  
}  

search.xml


<?xml version="1.0" encoding="utf-8"?>  
<searchs>  
  
    <search  
        name="google" age="14" >  
        <introduction>Hi, This is google search!</introduction>  
        <url>http://www.google.com</url>  
    </search>  
  
    <search  
        name="baidu" age="12" >  
        <introduction>Hi, This is baidu search!</introduction>  
        <url>http://www.baidu.com</url>  
    </search>  
  
    <search  
        name="biying" age="3" >  
        <introduction>Hi, This is biying search!</introduction>  
        <url>http://www.biying.com</url>  
    </search>  
  
</searchs>



Wi-Fi物理帧间隔概念简介 物理帧间隔概念简介。 阅读详情

相关推荐

MICS-6814多气体传感器与ESP32-C3 Mini接口构建空气监测系统

cararenuity C3 Mini的多个ADC引脚,Wi-Fi和蓝牙LE以及紧凑的设计使其成为嵌入式物联网应用的绝佳选择。在这个项目中,我们将把MICS-6814多气体传感器与基于esp32 -C3的开发板cararenuity C3 Mini连接起来。更多模拟引脚:与ESP8266只有一个ADC引脚不同,基于esp32 -C3的cararenuity C3 Mini提供多个ADC引脚,使其成为多传感器应用的理想选择。紧凑可靠:该板的小尺寸使其成为嵌入式应用的理想选择,而不会牺牲性能。

hie98894的博客 770

android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM

摘要: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次 ... 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一

一朶婲 3972

AutoCAD二次开发(.Net)之XData

对于CAD中的实体进行筛选等操作,常常会用到实体的XData属性,下面介绍一下实体的XData的增删改。 //XData的新增,修改跟新增一样,new一个ResultBuffer,赋值即可 Document doc=Application.DocumentManager.MdiActiveDocument; using (DocumentLock dl = doc.LockDocument()) { using (Transaction trans = doc.TransactionManager.S.

qq_21489689的博客 2593

Android解析XML三种方式(PULL、SAX、DOM)

本篇博客重点介绍Android中三种解析XML的方式,包括PULL、SAX、DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧。再顺便介绍一下AndroidTestCase的用法,用来测试所写的解析业务逻辑是否正确。 本篇博客使用的xml文件如下: student.xml ZhangSan

And.He 2725

概述DeepLab系列(deeplab v1, deeplab v2, deeplab v3, deeplab v3+)

前言:图像分割是指像素级别的图像识别,即标注出图像中每个像素所属的对象类别。 语义分割更注重类别之间的区分,而实例分割更注重个体之间的区别。 DeepLab是由Google团队提出的一系列图像分割算法。 DeepLab v1 (2014年) Paper (ICLR 2015) Code 创新点: 空洞卷积(Atrous Conv); <解决编码过程中信号不断被下采样,细节丢失的问题> 全连接条件随机场(Fully-connected Conditional Random Field)。

ZSH12345678900的博客 5529

从ADS到Origin:高效绘制负载牵引Smith圆图的完整指南

本文提供了一份从ADS导出负载牵引数据并在Origin中绘制专业Smith圆图的完整指南。详细介绍了数据导出、导入、关键的数据解释步骤,以及高效处理多组曲线的技巧,帮助射频工程师快速生成用于报告和论文的出版级图表。

tgb3456789的博客 1137

android解析XML总结(SAX、Pull、Dom三种方式)

欢迎我的独立博客,博客地址http://yywang.info      在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。      今天解析的xml示例(channels.xml)如下

wangyan9110's Blog 1013

Krylov子空间与Arnoldi过程

一、应用背景 Krylov子空间方法是模型降阶(MOR)的一种,Krylov 子空间方法就是在Krylov子空间中寻找近似解。 二、Krylov子空间 n是原始矩阵的维度,m为降阶后矩阵的维度,通常m<<n。 三、Arnoldi 过程: 计算Km 的一组正交 对应上述MGS过程的python代码: import numpy as np def arnoldi_itera...

保持写作习惯,完成知识沉淀 6004

Android三种解析XML方式(SAX,DOM,PULL)

在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。 下面是本例子要解析的XML文件:itcast.xml <?xml version="1.0" encoding="UTF-8"?> <persons>   <person id="1"

suzhen666的博客 733

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取

本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确

2401_87383958的博客 2358

多台树莓派(主机)通信

在做无人机实验时,有个任务需要 两台无人机 或 无人机与小车 进行通信。 由于我们飞机上用了树莓派,相当于一台电脑,索性选用Socket网络编程。 条件:树莓派、局域网(手机热点或路由器)。需要通信的两台树莓派接入同一个局域网。 如若现场没有网络,可将树莓派配置为无线路由器,发射wifi。网上很多教程,注意一点是树莓派需要先用网线接入路由器再配置。 发送数据: # -*- coding...

LNL_LNL的博客 7689

Android 解析XML文件的三种方式 DOM,SAX,PULL

我是通过参考:http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html在XML操作过程中,我们经常会想如何去处理它,在Android平台下,有三种解析XML文件的方式。第一种是DOM,它的特点是一次全部加载,如果对于数据量小的情况下,它的效率还可以,如果XML文件很大的情况下,速度就会慢起来。在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数

haha_mingg的专栏 9538

使用 MATLAB/Simulink + Deep Learning Toolbox,构建一个基于LSTM的电网负荷预测模

本文介绍了一个基于Simulink和深度学习的智能电网负荷预测与调度建模方法。通过LSTM神经网络构建负荷预测模型,将历史负荷、天气、日期等特征作为输入,预测未来24小时负荷。然后将训练好的模型集成到Simulink仿真系统中,结合发电单元模型和经济调度逻辑,实现预测驱动的电力调度优化。实验结果表明,该方法预测误差在2.5%-4.0%之间,相比传统调度方式可降低15%-25%的运行成本。文章详细展示了从数据准备、特征工程、模型训练到系统集成的完整流程,为智能电网中AI技术的应用提供了实用参考。

amy_mhd的博客 171

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。 xml示例(channels.xml)如下: 百度 腾讯 新浪 淘宝  一、使用sax方式解析  基础知识:

No Excuses! Confidence! Vigorous! 1732

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

convert android layout xml,详解Android之解析XML文件三种方式(DOM,PULL,SAX)

1.xml文件代码${fq.content}${fq.time}2.XML网页效果图3.Android代码1.布局文件xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_...

weixin_35905707的博客 275

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android 解析XML文件的三种方式 DOM,SAX,PULL

我是通过参考:http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html 在XML操作过程中,我们经常会想如何去处理它,在Android平台下,有三种解析XML文件的方式。 第一种是DOM,它的特点是一次全部加载,如果对于数据量小的情况下,它的效率还可以,如果XML文件很大的情况下,速度就会慢起来。 在an...

mobile payment development 193

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(五十七)android解析XML总结(SAX、Pull、Dom三种方式)

一、SAX、DOM、PULL的比较 SAX、DOM、PULL各有自己的特点,具体操作XML的时候该如何选择呢? 1.内存占用 这是一个根本性问题。由于Android手机性能相对于现在的应用操作还是有限的,程序对内存的占用直接影响到了解析XML的速度。在这点上,SAX、Pull以它们比DOM占用更少的内存的解析方式,更适合于Android手机开发。 2.编程方式 SAX采用事件驱...

a7m8111的博客 113

Android解析XML总结(SAX、Pull、Dom三种方式)

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的优快云阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。      今天解析的xml示例(channels.xml)如下: xml version="1.0" encoding="utf

巫巫巫 556
上一篇: android paint类
下一篇: Android解析Json例子
Chuekup
博客等级 码龄15年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值