Android 下用 Pull 解析和生成 XML

Java 中是可以用 SAX 和 DOM 解析 XML  的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull。Pull 使用简单,效率相对高,Android 下是集成了 Pull ,所以并不需要用到第三方的包。

下面来举例子,我要向 XML 文档中读写学生信息,首先我定义一个学生类,包含ID、学号、姓名和年龄

public class Student {
	public Student() {};
	
	public Student(int id, int number, String name, int age) {
		this.id = id;
		this.number = number;
		this.name = name;
		this.age = age;
	}


	private int id;
	private int number;
	private String name;
	private int age;
	
	public int getId() {
		return id;
	}
	public int getNumber() {
		return number;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
	@Override
	public String toString() {
		return "Student [number=" + number + ", name=" + name + ", age=" + age
				+ "]";
	}
}

要读取的 XML 文件里面内容是这样的

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student id="1">
		<number>33</number>
		<name>张三</name>
		<age>20</age>
	</student>
	<student id="2">
		<number>29</number>
		<name>李四</name>
		<age>19</age>
	</student>
</students>

然后我写了个 XmlHelper 类,有个静态方法 getStudes,该方法接受输入流,返回学生信息的集合

public static List<Student> getStudents(InputStream xml) throws Exception {
		List<Student> students = null;
		Student student = null;
		XmlPullParser parser = Xml.newPullParser(); //得到 Pull 解析器
		parser.setInput(xml, "UTF-8");	//设置输入,编码为 UTF-8
		
		int event = parser.getEventType(); //得到事件类型,每读取到一个位置都有相对的事件类型
		while (XmlPullParser.END_DOCUMENT != event) {	//没到文档结尾就要循环读取
			switch (event) {
			
			case XmlPullParser.START_DOCUMENT: //这是文档开始事件,我们在这个地方做一些初始化工作
				students = new ArrayList<Student>();
				break;
				
			case XmlPullParser.START_TAG:	//标签开始事件,标签开始就是上面XML中的 <students>、<student>、<number>、<name>、和 <age>
				if (parser.getName().equals("student")) { //读取到这个 student 标签就说明下面就是我需要的信息了
					int id = Integer.valueOf(parser.getAttributeValue(0));
					student = new Student();
					student.setId(id);
				}
				if (null != student) { //避免出现空指针,先判断一下再继续
					if (parser.getName().equals("number")) {
						int number = Integer.valueOf(parser.nextText()); // nextText() 就是得到标签后面的文本
						student.setNumber(number);
					}else if (parser.getName().equals("name")) {
						String name = parser.nextText();
						student.setName(name);
					}else if (parser.getName().equals("age")) {
						int age = Integer.valueOf(parser.nextText());
						student.setAge(age);
					}
				}
				break;
				
			case XmlPullParser.END_TAG:
				//读取到 </student> 时说明一个学生的信息已经读取完了
				if (parser.getName().equals("student")) {
					students.add(student);
					student = null;
				}
				break;
				
			default:
				break;
			}
			event = parser.next(); //一个读取完了,就下一个,如此循环
		}
		return students;
	}


读取就是这样了,接下来写怎样生成。generate 方法,接受学生信息集合和输出流
其实成成很好理解,就是按照顺序一块信息一块信息写下去

public static void generate(List<Student> students, OutputStream os) throws Exception {
		XmlSerializer serializer = Xml.newSerializer(); //得到序列化器
		serializer.setOutput(os, "UTF-8"); //设置输出
		serializer.startDocument("UTF-8", true); //文档开始了
		serializer.startTag(null, "students"); //标签开始了
		for (Student student : students) {
			serializer.startTag(null, "student"); //子标签开始了
			serializer.attribute(null, "id", String.valueOf(student.getId())); //指定该标签属性,这里是ID
			
			//下面3个就是生成学号、姓名和年龄
			serializer.startTag(null, "number");
			serializer.text(String.valueOf(student.getNumber()));
			serializer.endTag(null, "number");
			
			serializer.startTag(null, "name");
			serializer.text(student.getName());
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(student.getAge()));
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "student"); //子标签结束
		}
		serializer.endTag(null, "students"); //标签结束
		serializer.endDocument(); //文档结束
		os.flush(); //如果传入的输出流不是文件,就就要刷新一下缓冲区
		os.close();
	}
}

然后咱来写一个测试单元来测试一下这俩方法

public class XmlHelperTest extends AndroidTestCase {
	private static final String TAG = "XmlHelperTest";
	
	public void testGetStudents() throws Exception {
		InputStream xmlIstm = this.getClass().getClassLoader().getResourceAsStream("students.xml");
		List<Student> students = XmlHelper.getStudents(xmlIstm);
		for (Student student : students) {
			Log.i(TAG, student.toString());
		}
	}
	
	public void testGenerate() throws Exception {
		List<Student> students = new ArrayList<Student>();
		students.add(new Student(1, 13, "小建", 21));
		students.add(new Student(2, 16, "大康", 20));
		
		File xmlFile = new File(getContext().getFilesDir(), "students.xml");
		FileOutputStream fos = new FileOutputStream(xmlFile);
		try {
			XmlHelper.generate(students, fos);
			Log.i(TAG, "生成XML文件成功");
		} catch(Exception e) {
			Log.i(TAG, "生成XML文件失败:" + e.getMessage());
		}
	}
}

-----------------------
楼主以前都是写 C++ 的,也才学 Android 不久,加油吧。
好久没写博客了,感觉吧,还是应该坚持写下去。
**项目概述:** 本资源提供了一套采用Vue.js与JavaScript技术栈构建的古籍文献文字检测与识别系统的完整源代码及相关项目文档。当前系统版本为`v4.0+`,基于`vue-cli`脚手架工具开发。 **环境配置与运行指引:** 1. **获取项目文件**后,进入项目主目录。 2. 执行依赖安装命令: ```bash npm install ``` 若网络环境导致安装缓慢,可通过指定镜像源加速: ```bash npm install --registry=https://registry.npm.taobao.org ``` 3. 启动本地开发服务器: ```bash npm run dev ``` 启动后,可在浏览器中查看运行效果。 **构建与部署:** - 生成测试环境产物: ```bash npm run build:stage ``` - 生成生产环境优化版本: ```bash npm run build:prod ``` **辅助操作命令:** - 预览构建后效果: ```bash npm run preview ``` - 结合资源分析报告预览: ```bash npm run preview -- --report ``` - 代码质量检查与自动修复: ```bash npm run lint npm run lint -- --fix ``` **适用说明:** 本系统代码经过完整功能验证,运行稳定可靠。适用于计算机科学、人工智能、电子信息工程等相关专业的高校师生、研究人员及开发人员,可用于学术研究、课程实践、毕业设计或项目原型开发。使用者可在现有基础上进行功能扩展或定制修改,以满足特定应用场景需求。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【EI复现】基于阶梯碳交易的含P2G-CCS耦合燃气掺氢的虚拟电厂优化调度(Matlab代码实现)内容概要:本文介绍了基于阶梯碳交易机制的虚拟电厂优化调度模型,重点研究了包含P2G-CCS(电转气-碳捕集与封存)耦合技术燃气掺氢技术的综合能源系统在Matlab平台上的仿真与代码实现。该模型充分考虑碳排放约束与阶梯式碳交易成本,通过优化虚拟电厂内部多种能源设备的协同运行,提升能源利用效率并降低碳排放。文中详细阐述了系统架构、数学建模、目标函数构建(涵盖经济性与环保性)、约束条件处理及求解方法,并依托YALMIP工具包调用求解器进行实例验证,实现了科研级复现。此外,文档附带网盘资源链接,提供完整代码与相关资料支持进一步学习与拓展。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员或从事综合能源系统、低碳调度方向的工程技术人员;熟悉YALMIP常用优化算法者更佳。; 使用场景及目标:①学习复现EI级别关于虚拟电厂低碳优化调度的学术论文;②掌握P2G-CCS、燃气掺氢等新型低碳技术在电力系统中的建模与应用;③理解阶梯碳交易机制对调度决策的影响;④实践基于Matlab/YALMIP的混合整数线性规划或非线性规划问题建模与求解流程。; 阅读建议:建议结合提供的网盘资源,先通读文档理解整体思路,再逐步调试代码,重点关注模型构建与代码实现之间的映射关系;可尝试修改参数、结构或引入新的约束条件以深化理解并拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值