Android解析XML

Android XML文件读取解析三种方式 XML文件读取解析 阅读详情

 在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="23">
    <name>李明</name>
    <age>30</age>
  </person>
  <person id="20">
    <name>李向梅</name>
    <age>25</age>
  </person>
</persons>

        例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码:

public class Person {

private Integer id;
private String name;
private Short age;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Short getAge() {
return age;
}

public void setAge(Short age) {
this.age = age;
}
}

 

1. SAX解析XML文件

        SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

 

public static List<Person> readXML(InputStream inStream) {
try {
//创建解析器
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();

//设置解析器的相关特性,true表示开启命名空间特性
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
            XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(inStream, handler);
inStream.close();

return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}

return null;
}


//SAX类:DefaultHandler,它实现了ContentHandler接口。在实现的时候,只需要继承该类,重载相应的方法即可。
public class XMLContentHandler extends DefaultHandler {

private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;//当前解析的元素标签

public List<Person> getPersons() {
return persons;
}

//接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}

//接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;
//localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts 表示元素的属性集合
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

if(localName.equals("person")){
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}

this.tagName = localName;
}

//接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,
//后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
@Override
public void characters(char[] ch, int start, int length) throws SAXException {

if(tagName!=null){
String data = new String(ch, start, length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}

//接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
//localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)
@Override
public void endElement(String uri, String localName, String name) throws SAXException {

if(localName.equals("person")){
persons.add(currentPerson);
currentPerson = null;
}

this.tagName = null;
}
}

 

2. DOM解析XML文件

     DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

public static List<Person> readXML(InputStream inStream) {

List<Person> persons = new ArrayList<Person>();

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(inStream);

Element root = dom.getDocumentElement();

NodeList items = root.getElementsByTagName("person");//查找所有person节点

for (int i = 0; i < items.getLength(); i++) {
Person person = new Person();

//得到第一个person节点
Element personNode = (Element) items.item(i);

//获取person节点的id属性值
person.setId(new Integer(personNode.getAttribute("id")));

//获取person节点下的所有子节点(标签之间的空白节点和name/age元素)
NodeList childsNodes = personNode.getChildNodes();

for (int j = 0; j < childsNodes.getLength(); j++) {
Node node = (Node) childsNodes.item(j); //判断是否为元素类型

if(node.getNodeType() == Node.ELEMENT_NODE){
Element childNode = (Element) node;

       //判断是否name元素
if ("name".equals(childNode.getNodeName())) {
//获取name元素下Text节点,然后从Text节点获取数据
person.setName(childNode.getFirstChild().getNodeValue()); } else if (“age”.equals(childNode.getNodeName())) {
person.setAge(new Short(childNode.getFirstChild().getNodeValue()));
}
}
}

persons.add(person);
}

inStream.close();
} catch (Exception e) {
e.printStackTrace();
}

return persons;
}

 

3.Pull解析器解析XML文件

         Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

//读取XML
public static List<Person> readXML(InputStream inStream) {

XmlPullParser parser = Xml.newPullParser();

try {
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();

Person currentPerson = null;
List<Person> persons = null;

while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT://文档开始事件,可以进行数据初始化处理
persons = new ArrayList<Person>();
break;

case XmlPullParser.START_TAG://开始元素事件
String name = parser.getName();
if (name.equalsIgnoreCase("person")) {
currentPerson = new Person();
currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
} else if (currentPerson != null) {
if (name.equalsIgnoreCase("name")) {
currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
} else if (name.equalsIgnoreCase("age")) {
currentPerson.setAge(new Short(parser.nextText()));
}
}
break;

case XmlPullParser.END_TAG://结束元素事件
if (parser.getName().equalsIgnoreCase("person") && currentPerson != null) {
persons.add(currentPerson);
currentPerson = null;
}

break;
}

eventType = parser.next();
}

inStream.close();
return persons;
} catch (Exception e) {
e.printStackTrace();
}

return null;
}


//成XML文件
//使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件。
public static String writeXML(List<Person> persons, Writer writer){

XmlSerializer serializer = Xml.newSerializer();

try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);

//第一个参数为命名空间,如果不使用命名空间,可以设置为null
serializer.startTag("", "persons");

for (Person person : persons){
serializer.startTag("", "person");
serializer.attribute("", "id", person.getId().toString());
serializer.startTag("", "name");
serializer.text(person.getName());
serializer.endTag("", "name");
serializer.startTag("", "age");
serializer.text(person.getAge().toString());
serializer.endTag("", "age");
serializer.endTag("", "person");
}

serializer.endTag("", "persons");
serializer.endDocument();

return writer.toString();
} catch (Exception e) {
e.printStackTrace();
}

return null;
}


//使用代码如下(生成XML文件):

File xmlFile = new File("myitcast.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);

writeXML(persons, writer);
writer.flush();
writer.close();


//如果只想得到生成的xml内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
writeXML(persons, writer);
String content = writer.toString();

 

 4.SAX和PULL使用

    区别为:SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
    你随便找个sax和pull的例子比较一下就可以发现,pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。
PS:本文章并非真正意义上的原创,只是原文章有些错误予以改正,希望大家多多见谅。
文章原址:
http://kb.cnblogs.com/a/2323668/

xml2code:用于android布局视图的代码生成器,可节省编​​码时间 XML 2 代码 android 布局视图的代码生成器,可节省编​​码时间。 它是如何工作的? 只需在应用程序图标上拖动布局文件(xml 类型),在剪贴板中获取生成的代码,将剪贴板文本粘贴到 eclipse(android IDE)中,右键单击代码,选择源代码->组织导入并直接进入您的想法,无需担心视图的声明。 立即下载

相关推荐

XML解析框架比较

NULL 博文链接:https://qingkangxu.iteye.com/blog/1838405

Xsd2Code是什么?灵活的XML以及JSON模式的代码生成器

Xsd2Code是什么?灵活的XML以及JSON模式的代码生成器   什么是Xsd2Code ++?   开发人员生产力扩展基本上是一种创新的,灵活的XML以及JSON模式的代码生成器。它允许用户将XML文件放入C#甚至VB过程中,以供用户和开发人员使用,反之亦然,将序列化以及反序列化过程直接集成到集成的Microsoft Visual Studio中,也被认为拥有真正的生产力工具。它具有帮助程序员和用户控制XML文档的能力,甚至不需要了解XML或处理XML的方式。XML文档的处理过程基本上是用先前在X

q2315702359的博客 567

最新版Node.js下载安装及环境配置教程(非常详细)

选择对应你系统的Node.js版本。

DN金猿的博客 12万+

Android安卓使用SAX方式解析xml

Android安卓使用SAX方式解析xml 修改activity_main.xml中代码,添加button控件,实现点击解析 <Buttonandroid:id="@+id/parser"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="解析"/> 2.新建MyHandler类继承DefaultHandler ...

qq_37196621的博客 384

【HALCON+C#实战】3D点云测量系统开发全攻略:从源码解析到工业应用

本文详细介绍了基于HALCON和C#开发3D点云测量系统的全流程,从环境搭建、核心算法实现到工业应用优化。通过源码解析和实战技巧,帮助开发者解决点云数据处理、几何测量及系统集成中的常见问题,提升工业检测的精度与效率。

brown的博客 209

Bochs源码分析 - 4: 使用ida来调试bochs

前言 bochs内部提供了一个调试器,但是这个命令行调试器相当难用,想找一个gui的debugger。第一次是在百度百科的bochs词条中介绍的peter-bochs-debugger调试器(java编写),但是后来发现ida也有一个bochs调试器,因为对ida比较熟悉,就选用此作为bochs调试器。 在配置过程中参考博客 https://blog.youkuaiyun.com/cssxn/article/details/90738498 中的配置,但是这是直接发布版本,拿源码编译...

WriteAnything_的博客 2755

php解析安卓xml文件,Android XML数据解析

本节引言:前面两节我们对Android内置的Http请求方式:HttpURLConnection和HttpClient,本来以为OkHttp已经集成进来了,然后想讲解下Okhttp的基本用法,后来发现还是要导第三方,算了,放到进阶部分吧,而本节我们来学习下Android为我们提供的三种解析XML数据的方案!他们分别是:SAX,DOM,PULL三种解析方式,下面我们就来对他们进行学习!1.XML数据...

weixin_26834815的博客 206

每日算法讲解(十):使用BP神经网络进行回归任务

BP神经网络是由输入层、隐藏层和输出层组成的多层前馈神经网络,通过反向传播算法(Backpropagation)来调整网络权重和偏置,以最小化预测误差。前向传播:将输入数据通过网络,计算每层的激活值和输出。计算误差:根据预测值和真实值之间的差异计算损失函数值。反向传播:从输出层开始,逐层向后计算梯度,并更新每层的权重和偏置。重复迭代:通过多次迭代,逐步减小预测误差,优化模型参数。接下来,我们定义一个包含一个输入层、两个隐藏层和一个输出层的BP神经网络模型。# 定义模型# 编译模型。

rhtee的博客 1726

Android安卓使用pull方式解析xml

Android安卓使用pull方式解析xml 主要类 importorg.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserFactory; 主要代码 网络获取Xml字符串可以通过http从服务器获取,获取xml字符串可参考 https://blog.youkuaiyun.com/qq_37196621/article/details/109300850 https://blog.youkuaiyun.com/qq_37196621/article/de.

qq_37196621的博客 263

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

安卓下xml文件的解析

------------------------------------------------------------------------- 下面介绍pull解析和sax解析xml的方式,dom一般不会在移动设备上使用,故略去。--------------------------------------------------------------------------}else if("weather".equals(currentTag))//是否是weather节点。

weixin_71792169的博客 1112

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6275

android xml模板下载,安卓xml序列化和xml解析模板

xml解析//xml文件的pull解析try {// 1.通过Xml获取一个XmlPullParser对象XmlPullParser parser = Xml.newPullParser();//2.设置解析器的初始化参数File file = new File(getFilesDir(), "xxx.xml");FileInputStream in = new FileInputStream(f...

weixin_35293785的博客 240

Unity 之jenkins自动打包

1.Jenkins 是什么? jenkins官方网址:https://www.jenkins.io/zh/ Jenkins是一款开源 CI&CD(持续集成&持续部署) 软件,用于自动化各种任务,包括构建、测试和部署软件。 简易安装:Jenkins 是一个基于 Java 的独立程序,可以立即运行,包含 Windows、Mac OS X 和其他类 Unix 操作系统。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。 插件扩展:通过更新中心中的

TxNet 2132

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android中解析XML

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。SAX解析器:SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调

LiuHe 22万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓入门——XML解析

XML解析的三种方式 开始自学安卓。打算用3天时间达到能看懂安卓代码的程度。那么,我们开始。 xml解析的三种方式分别是:Dom解析、Sax解析、Pull解析。其中Dom解析和Sax解析在Java ee中用到的比较多,Pull解析一般用于Android开发。 DOM解析 先加载全部代码,进行全部解析,生成树。每个元素都解析为一个Node节点 ,常用到的节点类型又分为: ——元素节点 Elemen...

weixin_44593338的博客 232

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

安卓xml解析

在Android平台下几种常见的XML解析方法。分别为SAX解析器、DOM解析器和PULL解析器. SAX解析器:SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件

yimei32的博客 702

安卓开发工程师-数据解析(JSON、XML)

在解析 JSON 或 XML 数据时,可能会出现各种异常,如格式错误、数据缺失、类型不匹配等。为了保证程序的健壮性,需要对这些异常进行合理的处理。在解析 JSON 或 XML 数据时,可以将解析后的数据缓存起来,以便下次使用时可以直接从缓存中获取,而无需重新解析。在 Android 中,可以使用 DOM(Document Object Model)解析器来解析 XML 数据。动态解析是指在不知道 JSON 或 XML 数据的具体结构的情况下,能够灵活地解析和处理数据。包来解析 JSON 数据。

qq_62784677的博客 1049

【安卓笔记】安卓下xml文件的解析

安卓下解析xml文件有多种方式: dom: 通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;简单直观,但需要将文档读取到内存,并不太适合移动设备; sax: SAX是一个解析速度快并且占用内存少的xml解析 器;采用事件驱动,它并不需要解析整个文档;实现:继承DefaultHandler,覆写startElement、

RowandJJ 2516

Android解析XML文件

按计划每周更新一篇技术博文,第一篇:《Android解析XML文件》 一、在Android应用中的XML文件来源 1、本地xml文件     本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等; 除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourcePar

钟秀 4万+

安卓 解析xml

安卓获取服务器的数据分为两种形式,一种为xml,一种为json.这两种形式都需要通过解析才能获得数据,今天就分享一下xml的解析。博主写了一个小demo。从java服务器中获取数据并展示在移动端。由于一些问题,不能放效果图,不过主页面也就是一个Button,通过Button点击事件获取数据。接下来贴的是服务器的代码。实体类就不贴了,直接贴方法吧!因为是个简单的demo,数据就是模拟的。java代码:

l_blackeagle的博客 338

android xml解析,android解析xml文件

在androd手机中处理xml数据是很常见的事情,通常在不同平台传输数据的时候就可能使用xml。xml与平台无关的特性,被广泛运用于数据通信中。android中解析xml文件数据通常有三种方式:DOM,SAX,PULL。一、DOM方式DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的。但是这样一来,如果xml文件很大(手机CPU处理能力当然不能与P...

weixin_36367702的博客 1338

Android解析XML格式数据

Android解析XML格式数据

Android应用开发工程师 1644
上一篇: Hibernate中Criteria的完整用法
下一篇: HIbernate注解详解
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值