pull xml(2): 解析xml文件

Qt 侧边菜单栏+堆叠窗口stackedWidget 效果如下:环境:Qt 6.6.2 MSVC2019 64bit。 阅读详情

在pull xml(1): 创建xml文件文章中主要说了说如何生成xml文件,该篇博客主要谈谈如何解析已知的xml文件。

运行界面,如下展示:

没有什么可以搪塞的,看源码吧!

1. 业务逻辑类PullXMLUtils

主要是解析或者生成xml文件

package mark.zhang;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

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

import android.util.Log;
import android.util.Xml;

public class PullXMLUtils {

	/**
	 * 创建xml文件
	 * 
	 * @param items
	 *            存储view状态
	 * @param outStream
	 *            输出
	 * @throws Exception
	 */
	public static void createXML(List<ViewState> items, OutputStream outStream)
			throws Exception {
		XmlSerializer serializer = Xml.newSerializer();
		// 设置输出及编码
		serializer.setOutput(outStream, "utf-8");
		// 构建文档类似:<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
		serializer.startDocument("utf-8", true);
		// 开始Tag
		serializer.startTag(null, "state");

		for (ViewState vs : items) { // 增强for循环
			serializer.startTag(null, "view");
			serializer.attribute(null, "name", vs.getName());

			serializer.startTag(null, "text");
			serializer.text(vs.getText());
			serializer.endTag(null, "text");

			serializer.startTag(null, "id");
			serializer.text(String.valueOf(vs.getId()));
			serializer.endTag(null, "id");

			serializer.endTag(null, "view");
		}
		// 结束Tag
		serializer.endTag(null, "state");
		// 结束文档
		serializer.endDocument();
		// 关闭流
		outStream.flush();
		outStream.close();
	}

	/**
	 * 创建xml文件,过载方法
	 * 
	 * @param items
	 *            存储view状态
	 * @param writer
	 *            字符流
	 * @throws Exception
	 */
	public static void createXML(List<ViewState> items, Writer writer)
			throws Exception {
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(writer);
		serializer.startDocument("utf-8", true);
		serializer.startTag(null, "state");

		for (ViewState vs : items) {
			serializer.startTag(null, "view");
			serializer.attribute(null, "name", vs.getName());

			serializer.startTag(null, "text");
			serializer.text(vs.getText());
			serializer.endTag(null, "text");

			serializer.startTag(null, "id");
			serializer.text(String.valueOf(vs.getId()));
			serializer.endTag(null, "id");

			serializer.endTag(null, "view");
		}
		serializer.endTag(null, "state");
		serializer.endDocument();
		// 关闭流
		writer.flush();
		writer.close();
	}

	/**
	 * 解析xml文件
	 * 
	 * @param inputStream
	 *            输入流
	 * 
	 * @throws XmlPullParserException
	 * @throws IOException
	 * @return 集合对象ArrayList
	 */
	public static ArrayList<ViewState> parseXML(InputStream inputStream)
			throws XmlPullParserException, IOException {
		ViewState vState = null;
		ArrayList<ViewState> items = null;

		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inputStream, "utf-8");
		// 事件驱动类型码
		// XmlPullParser.START_DOCUMENT = 0
		// XmlPullParser.END_DOCUMENT = 1
		// XmlPullParser.START_TAG = 2
		// XmlPullParser.END_TAG = 3
		// XmlPullParser.TEXT = 4
		int eventType = parser.getEventType();
		
		/* 不是结束文档的话,一直循环 */
		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				// 文档开始(<?xml version='1.0' encoding='utf-8' standalone='yes'?>)
				// 初始化逻辑代码可以放在这里
				items = new ArrayList<ViewState>();
				break;
			case XmlPullParser.START_TAG:
				// 文档开始节点
				if ("view".equals(parser.getName())) {
					Log.d("mark", "num: " + parser.getAttributeCount());
					// 获得属性值的个数
					int count = parser.getAttributeCount();
					// 索引从0开始,这里只有一个name属性值,所以下面代码等效
					// String name = parser.getAttributeValue(0);
					String name = parser.getAttributeValue(count-1);
					vState = new ViewState();
					vState.setName(name);
				}
				if (vState != null) {
					if ("text".equals(parser.getName())) {
						vState.setText(parser.nextText());
					}
					if ("id".equals(parser.getName())) {
						vState.setId(new Integer(parser.nextText()));
					}
				}
				break;
			case XmlPullParser.TEXT:
				// 如果是文本
				break;
			case XmlPullParser.END_TAG:
				// 文档结束节点
				if ("view".equals(parser.getName())) {
					items.add(vState);
					vState = null;
				}
				break;
			}
			// 获得下一个事件类型
			eventType = parser.next();
		}
		return items;
	}
}
2. Activity

MasterActivity类。

package mark.zhang;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MasterActivity extends Activity {
	private Button btn_createXML = null;
	private Button btn_parseXML = null;
	
	private ListenerEven listenerEven = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
        findViews();
        setEvens();
    }
    
    /**
     * 初始化
     * 
     */
	private void init() {
		System.out.println(getPackageName());// mark.zhang
		listenerEven = new ListenerEven();
	}

	/**
	 * 设置监听
	 * 
	 */
	private void setEvens() {
		btn_createXML.setOnClickListener(listenerEven);
		btn_parseXML.setOnClickListener(listenerEven);
	}

	/**
	 * 创建控件对象
	 */
	private void findViews() {
		btn_createXML = (Button) findViewById(R.id.btn_createXML);
		btn_parseXML  = (Button) findViewById(R.id.btn_parseXML);
	}
	
	/**
	 * 创建xml文件
	 * @throws Exception
	 */
	public void createXML() throws Exception {
		// 创建文件保存路径:data/data/app/files/uistate.xml
		System.out.println("getFilesDir(): " + getFilesDir().getAbsolutePath());
		System.out.println("getFilesDir(): " + getFilesDir().getName());
		File file = new File(getFilesDir(), "uistate.xml");
		
		ArrayList<ViewState> vState = new ArrayList<ViewState>();
		// 添加数据
		vState.add(new ViewState("button", "send", 10));
		vState.add(new ViewState("textview", "this is a demo!", 11));
		
		// 方式1
		/*FileOutputStream outStream = new FileOutputStream(file);
		PullXMLUtils.createXML(vState, outStream);*/
		
		// 方式2
		FileWriter writer = new FileWriter(file);
		PullXMLUtils.createXML(vState, writer);
		
		// 方式3:可用于显示
		/*StringWriter sWriter = new StringWriter();
		Log.d("mark", sWriter.toString());*/
	}
	
	/**
	 * 解析xml文件,该文件来自data/data/App包名/files目录
	 * 
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public void parseXML() throws XmlPullParserException, IOException {
		FileInputStream inStream = openFileInput("uistate.xml");
		ArrayList<ViewState> items = PullXMLUtils.parseXML(inStream);
		for(ViewState vState : items) {
			Log.d("mark", vState.toString());
		}
	}
	
	/**
	 * 解析来自资源文件的xml文件,一般将文件放到工程目录/src下面
	 * 
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public void parseFormResourceXML() throws XmlPullParserException, IOException{
		InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("uistate.xml");
		ArrayList<ViewState> items = PullXMLUtils.parseXML(inStream);
		for(ViewState vState : items) {
			Log.d("mark", vState.toString());
		}
	}
	
	/**
	 * @author mark 
	 * 
	 * 内部类,Button点击事件处理
	 */
	final class ListenerEven implements OnClickListener {
		
		@Override
		public void onClick(View v) {
			switch(v.getId()) {
			case R.id.btn_createXML:
				try {
					createXML();
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			case R.id.btn_parseXML:
				try {
					//parseXML();
					parseFormResourceXML();
				} catch (XmlPullParserException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				break;
			default:
				break;
			}
		}
	}
}
3. 说明

如果使用parseXML()方法解析xml文件的话,需要先createXML(),这样在对应文件夹下面才会产生xml文件。

如果使用parseFormResourceXML()方法解析xml文件的话,需要准备xml文件,对应目录如下:

即把uistate.xml文件放到src目录下面。

4. uistate.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<state>
	<view name="button">
		<text>send</text>
		<id>10</id>
	</view>
	
	<view name="textview">
		<text>this is a demo!</text>
		<id>11</id>
	</view>
</state>

目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究 近几年来,在计算机视觉领域,利用深度学习卷积神经网络技术来实现各种任务的算法越来越多。毫米波雷达、相机、激光雷达、超声波雷达等车载传感器生产成本的降低,汽车的自动驾驶技术得到了飞速发展,在我们的日常生活中经常能看到该技术辅助汽车驾驶员进行行车。和非自动驾驶汽车相比,自动驾驶汽车存在诸多优点,如进一步减少交通事故,保障人身安全;提供安全合理的路线,避免交通拥堵;采用清洁无污染的电能作为汽车新能源,从而降低大气污染等。现如今,自动驾驶技术已经逐渐深入到各个领域并发挥着关键的作用。 阅读详情

相关推荐

棋牌App逆向工程实战:透视风险分析与反作弊加固思路

在移动应用安全领域,逆向工程是一项关键的攻防技术,它通过静态分析、动态调试与协议抓包等手段,深入还原客户端真实逻辑。这项技术的核心原理,是从已编译的安装包中提取数据流,验证服务端下发的信息是否超出了客户端应有的可见范围。从技术价值看,安全测试人员可以借此定位协议层、内存层与缓存层的潜在风险,为反作弊体系提供精准的加固建议。在棋牌类App等实时对局场景中,逆向工程常被用于排查牌局信息泄露类隐患,而合规授权与测试环境是开展此类研究的必要前提。本文结合一次棋牌App的安全评估实践,梳理了从环境准备到数据流还原的完

weixin_29326909的博客 175

15、使用Pull解析XML

学习目标: 1、了解PULL的原理和使用场景以及与SAX的区别 2、掌握使用PULL读取XML文档 学习过程: 一、Pull和Sax的区别 Pull解析器和SAX解析器都是基于事件的解析XML,与DOM对比优势也是一样的。但是Pull解析器称为拉的模式,而SAX成为推的模式, 等一下通过阅读代码大家可以直观的感受到两者之间的差别,SAX在解析过程是会把事件推入到注册的事件处理器中,解析结...

JavaDayUp 202

PSM倾向匹配详细步骤和程序

目录1.安装psmatch2统计包。2.数据准备3.数据分析及命令解读4.结果解读4.1模型拟合结果,此处无太多实际意义。4.2试验组可匹配的观测概览,按照命令中设定的匹配规则,试验组有8例患者未能匹配到合适对照。4.3结果解读的重点应该是对stata新生成的中间变量的解读。4.4均衡性检验结果4.5匹配结果的图示化5.Stata命令汇总最后留下两个问题给大家思考:题目 试验设计中,匹配的目的在于确保干预效应估计是建立在可比个体之间的不同结果的基础上。最简单的匹配方式是将干预组和对照组中协变量值相同的两个个

平平淡淡,戒急用忍,一生学闭嘴。 5万+

Android XML数据的三种解析方式(Pull解析)

Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法, 首先先在Assets目录下创建file.xml 加入如下的内容 <?xml version="1.0"?> <records>...

qinxuexiang_blog的博客 410

LVGL的基础知识总结

另外,还有自定义字库的使用,具体可参考开发手册。

qq_28576837的博客 7389

从 0 到 1,实战 Power BI 电商销售可视化看板全流程

本文详细介绍了从零开始使用Power BI构建电商销售可视化看板的全流程,涵盖数据准备、建模、可视化设计及高级功能应用。通过实战案例展示如何将复杂销售数据转化为直观图表,帮助电商从业者快速掌握销售趋势、热销产品和用户画像等关键信息,提升数据分析效率。

weixin_29061041的博客 484

安卓解析XML文件系列2:使用PULL方式

安卓中解析XML文件的方式有三种,下面将第二种方式的使用方法介绍给大家。 使用pull比使用sax代码量少一些,PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件。 PULL特点: 简单的结构:一个接口,一个例外,一个工厂组成的PULL解析器 简单易用:PULL解析器只有一个重要的方法next方法,它被用来检索下一个事件,而它只有5个常用的属性: START DOCUM

luoshiwutai的博客 749

从‘最长白列’到‘八邻域’:智能车图像巡线算法怎么选?我的踩坑经验分享

本文深入探讨了全国大学生智能汽车竞赛中图像巡线算法的选型与优化,对比了最长白列法、八邻域算法等五种主流方法的性能与适用场景。通过实战数据和代码示例,分析了各算法在直道、弯道及特殊赛道元素中的表现,并提供了内存优化、参数调整等实用技巧,帮助参赛团队提升智能车的巡线精度与效率。

weixin_30374009的博客 632

Android下Xml解析技术(2)之PULL解析Xml文件

Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。 官网:http://www.xmlpull.org Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事

andrew的博客 398

FPGA实现PID算法

PID 控制器表达式如下(引用某硕士论文 《基于FPGA的PID控制器研究与实现》): 其中,Kp为比例增益,Ti为积分时间常数,Td为微分时间常数,u(t)为控制量,e(t)为偏差。 在数字控制系统中,PID控制规律的实现必须用数值逼近的方法。当采样周期相当短时,用求和代替积分、用后向差分代替微分,使模拟PID离散化变为差分方程。 本文使用并行结构来实现。具有延时小,计算速度快的特点,但需要资源比较多。 利用图3.2所示并行结构实现方法 ,进一步将3.8式分解: ...

nxin168的博客 1万+

【用ArcGIS制作一张好看的中国月度气温图

要最后选中那个事先调整好的那个数据框,这样其他两个数据框才能和其大小一致。

J_Giser的博客 1017

android学习笔记2:解析xml文件(pull)

1.使用Pull解析器解析XML文档   Pull解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如文档开始、文档结束、开始元素和结束元素等。使用parser.next()方法可以进入下一个元素并触发相应的事件。各种事件均已数字的形式被发送,因此可以在程序中使用一个switch语句来对事件进行选择,然后进行相应的事件处理。 1.1事件类型   Pull解析器...

dianlv7051的博客 145

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2949

java pull 修改 xml_Java之Pull方式生成xml文件和解析xml文件

Pull XML解析器早已经被google集成到android sdk当中,它是google官方推荐的解析器。如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和解析xml文件,需要用到kxml2;KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/实验开始:在Eclipse中新建一个java项目,其中新建一个libs文件夹,...

weixin_39612122的博客 177

桥梁上CRTSⅠ型双块式无砟轨道模型命令流,单跨桥梁模型,ansys源码.zip

桥梁上CRTSⅠ型双块式无砟轨道模型命令流,单跨桥梁模型,ansys源码

StoneWall-2000网络安全隔离设备_正向型_安装手册[整理].pdf

StoneWall-2000网络安全隔离设备_正向型_安装手册[整理].pdf

Android数据存储——2.文件存储_E_Pull解析XML文档

今天学习Android数据存储——文件存储_Pull解析XML文档      如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。     Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自

無名的博客 1383

自动化伺服电机选型.rar

自动化伺服电机选型.rar

Java之Pull方式生成xml文件和解析xml文件

Pull XML解析器早已经被google集成到android sdk当中,它是google官方推荐的解析器。 如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和解析xml文件,需要用到kxml2; KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/ 普通XML PULL解析器的官网是http://x

bear_huangzhen的专栏 5015

图像配准技术合并 landsat 和 sentinel 卫星图像。.zip

1.版本:matlab2014a/2019b/2024b2.附赠案例数据可直接运行。3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

《第一行代码》第十章-Pull解析方式

起因是自己在实际操作的过程中在这一节卡住了,因为此书是2014年的,有些地方难免与现在有些不一样。而这些正好能祛除我的浮躁。 工具:Android Studio 2.2.2 网络上传输数据时最常用的格式有两种:XML和JSON,所以学习XML的解析是很有必要的。 解析XML有三种方式:PULL、SAX和DOM,书中只讲了前两种。本文以第一种为例。新建名为get_data.xml文件。<a

THREEK的专栏 1271

android XPath 解析xml

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。 因此,对 XPath 的理解是很多高级 XML 应用的基础。具体学习XPath参照http://www.w3school.com.cn/xpath/ind

Carson IT之旅 9122

java xml解析 pull解析

step1 导入依赖 <!-- https://mvnrepository.com/artifact/net.sf.kxml/kxml2 --> <dependency> <groupId>net.sf.kxml</groupId> <artifactId>kxml2</artifactId> <version>2.3.0</version> </depende

m0_45877477的博客 429

kxml解析 xml的两种方式

 KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。WTK下载地址:http://java.sun.com/products/j2mewtoolkit/download-2_0.htmlKxml下载地址:http://kxml.objectweb.org/software/downloads/

Class_Raito的专栏 2731

XML文件解析

XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,

猛虎o蔷薇 552

Android开发8——利用pull解析器读写XML文件

Android开发8——利用pull解析器读写XML文件

qq_44884300的博客 519

PULL解析XML文件

PULL解析XML文件的步骤: 1,  导包  2,  创建pull解析器工厂  3,  创建解析器对象  4,  设置解析的数据源(要解析的内容)  5,   获取事件的类型(int)    6,  循环解析, 直到文档解析完成 解析实例: XML文件: 1 zhangsan 20 male 2 lisi 21 female

Android 489

java中采用Pull解析器对XML文件进行解析

一、基本介绍 Android中极力推荐xmlpull方式解析xml。 xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。 jar包下载网址 http://www.xmlpull.org/ http://kxml.sou...

weixin_33885253的博客 116

pull解析xml文件

XML文件是android上存储数据方式中的一种,根SQLite

被遗忘的角落 941

学习用pull解析解析xml文件

博主我最近学习了下android的pull解析,大概解析代码如下: public class WeatherService { public static List getWeatherInfo(InputStream is) throws Exception { // 1、新建一个解析器parser XmlPullParser parser = Xml.newPullPar

程序媛coco的专栏 852
上一篇: Spinner(3): OnItemSelectedListener 触发时机
下一篇: UI效果(3): 自定义Dialog
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值