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://xmlpull.org/

实验开始:

在Eclipse中新建一个java项目,其中新建一个libs文件夹,拷贝从网上下载的kxml2-2.2.2.jar文件到其中,配置好编译路径;

我们要操作的xml文件样式如下:

 <?xml version="1.0" encoding="UTF-8"?>
   <root>
   	<wisdom id="1">
  			<content>此刻打盹,你将做梦;而此刻学习,你将圆梦</content>
  			<author>哈佛图书馆</author>
  		</wisdom>
  		<wisdom id="2">
  			<content>我荒废的今日,正是昨日殒身之人祈求的明日</content>
  			<author>哈佛图书馆</author>
  		</wisdom>
   </root>

对应xml文件中的每一个节点用一个实体类来描述:

public class Wisdom {

	private int id;
	private String content;
	private String author;

	public Wisdom() {
		super();
	}

	public Wisdom(String content, String author) {
		super();
		this.content = content;
		this.author = author;
	}

	public Wisdom(int id, String content, String author) {
		super();
		this.id = id;
		this.content = content;
		this.author = author;
	}

	public int getId() {
		return id;
	}

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

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

}

核心类有两大功能:

1.解析

2.生成

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.kxml2.io.KXmlParser;
import org.kxml2.io.KXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

/**
 *
 * @author Administrator
 *
 */
public class PullDemo {

	/**
	 * 解析输入流中的xml文件
	 *
	 * @param is 输入流
	 * @return 解析结果集
	 */
	public List<Wisdom> parseXml(InputStream is) {
		// 声明返回值
		List<Wisdom> wisdomList = null;
		// 获取解析对象
		XmlPullParser xmlPullParser = new KXmlParser();

		try {
			// 设置输入流的编码
			xmlPullParser.setInput(is, "utf-8");
			// 获取解析的事件类型
			int eventType = xmlPullParser.getEventType();
			// 声明一个Wisdom引用
			Wisdom wisdom = null;
			// 判断文件解析的是否完毕
			while (eventType != XmlPullParser.END_DOCUMENT) {

				String tagName = xmlPullParser.getName();

				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					wisdomList = new ArrayList<Wisdom>();
					break;

				case XmlPullParser.START_TAG:

					if ("wisdom".equals(tagName)) {
						// 创建wisdom对象
						wisdom = new Wisdom();
						wisdom.setId(Integer.parseInt(xmlPullParser
								.getAttributeValue(null, "id")));
					} else if ("content".equals(tagName)) {
						wisdom.setContent(xmlPullParser.nextText());
					} else if ("author".equals(tagName)) {
						wisdom.setAuthor(xmlPullParser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if ("wisdom".equals(tagName) && wisdom != null) {
						// 把wisdom对象加入到集合中去
						wisdomList.add(wisdom);
						wisdom = null;
					}
					break;
				}
				//读取下一个事件
				eventType = xmlPullParser.next();
			}
			//关闭输入流
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return wisdomList;
	}

	/**
	 * 根据List列表中的内容生成xml文件
	 *
	 * @param wisdomList
	 *            装在多个wisdom对象的List
	 * @return true表示生成成功,false表示生成失败
	 */
	public boolean createXML(List<Wisdom> wisdomList) {
		// 采用pull解析进行实现
		// 目标文件路径
		String filePath = "D:\\wisdoms.xml";
		// 目标文件
		File file = new File(filePath);
		// 获得xml序列化实例
		XmlSerializer serializer = new KXmlSerializer();
		// 文件写入流实例
		FileOutputStream fos = null;
		try {
			// 根据文件对象创建一个文件的输出流对象
			fos = new FileOutputStream(file);
			// 设置输出的流及编码
			serializer.setOutput(fos, "utf-8");
			// 设置文件的开始
			serializer.startDocument("UTF-8", true);
			// 设置文件开始标签
			serializer.startTag(null, "root");
			for (Wisdom wisdom : wisdomList) {
				// wisdom标签的开始
				serializer.startTag(null, "wisdom");
				// 设置wisdom标签的属性
				serializer.attribute(null, "id", wisdom.getId() + "");

				// 设置wisdom标签的子标签 content
				serializer.startTag(null, "content");
				serializer.text(wisdom.getContent());
				serializer.endTag(null, "content");

				// 设置wisdom标签的子标签的age
				serializer.startTag(null, "author");
				serializer.text(wisdom.getAuthor());
				serializer.endTag(null, "author");

				// wisdom标签的结束
				serializer.endTag(null, "wisdom");

			}

			// 设置文件结束标签
			serializer.endTag(null, "root");
			// 文件的结束
			serializer.endDocument();

			serializer.flush();
			fos.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}

}

在main方法中使用核心类,先在D盘(windows操作系统)生成xml文件,然后解析这个xml文件,把解析出来的集合打印到控制台。

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

public class PullTest {

	public static void main(String[] args) {

		//*************初始化List列表集合****开始**************
		ArrayList<Wisdom> wisdomList = new ArrayList<>();

		Wisdom w = new Wisdom();
		w.setId(1);
		w.setContent("此刻打盹,你将做梦;而此刻学习,你将圆梦");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(2);
		w.setContent("我荒废的今日,正是昨日殒身之人祈求的明日");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(3);
		w.setContent("觉得为时已晚的时候,恰恰是最早的时候");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(4);
		w.setContent("勿将今日之事拖到明日");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(5);
		w.setContent("学习时的苦痛是暂时的,未学到的痛苦是终生的");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(6);
		w.setContent("学习这件事,不是缺乏时间,而是缺乏努力");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(7);
		w.setContent("幸福或许不排名次,但成功必排名次");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(8);
		w.setContent("学习并不是人生的全部。但既然连人生的一部分——学习也无法征服,还能做什么呢?");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(9);
		w.setContent("请享受无法回避的痛苦");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(10);
		w.setContent("只有比别人更早、更勤奋地努力,才能尝到成功的滋味");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(11);
		w.setContent("谁也不能随随便便成功,它来自彻底的自我管理和毅力");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(12);
		w.setContent("时间在流逝");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(13);
		w.setContent("现在流的口水,将成为明天的眼泪");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(14);
		w.setContent("狗一样地学,绅士一样地玩");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(15);
		w.setContent("今天不走,明天要跑");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(16);
		w.setContent("投资未来的人,是忠于现实的人");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(17);
		w.setContent("受教育程度代表收入");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(18);
		w.setContent("一天过完,不会再来");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(19);
		w.setContent("即使现在,对手也不停地翻动书页");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);

		w = new Wisdom();
		w.setId(20);
		w.setContent("没有艰辛,便无所获");
		w.setAuthor("哈佛图书馆");
		wisdomList.add(w);
		//*************初始化List列表集合****结束**************

		//新建PullDemo对象
		PullDemo pd = new PullDemo();
		//生成xml文件
		pd.createXML(wisdomList);

		try {
			File file = new File("D:\\wisdoms.xml");
			//读取文件流
			FileInputStream fis = new FileInputStream(file);
			//调用解析xml方法获得结果集合
			List<Wisdom> list = pd.parseXml(fis);
			//循环打印
			for (Wisdom wisdom : list) {
				System.out.println(wisdom.getContent());
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}

}

实验结束。在此附上KXML2的jar包下载地址:kml2-2.2.2.jar

希望以上代码对大家有所帮助!

时间: 2024-12-24 04:11:55

Java之Pull方式生成xml文件和解析xml文件的相关文章

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

xml基础及其解析xml文档

xml基础及其解析xml文档 xml基础及其解析xml文档 xml基础语法 中国特色乱码问题 写xml文件的工具 xml中使用的转义字符 处理指令已经过时 xml的两个重要的功能 xml注释 xml解析Java应用程序读取xml文件的内容 xml解析原理 xml解析工具 DOM4J使用 DOM4J中核心API 将xml文档从磁盘读进内存形成Document对象 读取所有的标签节点 读取所有的属性节点 读取所有的文本节点 解决上面提出的问题 xml基础语法 一个基本的xml构成: <!--vers

第七章、epub文件处理 -- 解析 .xhtml文件 (一)

第七章.epub文件处理 -- 解析 .xhtml文件 (一) 本章将介绍代码如何利用ZLTextPlainModel类来分别处理.xhtml文件中的文本信息与标签信息. 本章涉及的核心类是ZLTextPlainModel类.ZLTextWritablePlainModel类.CachedCharStorage类.XHTMLTagAction接口实现类 .xhtml文件中包含着两种信息:文本信息与标签信息.我们需要先正确解析出标签信息代表的结构,才能正确得将文本信息显示在屏幕上. 举个例子:(这

通过上传的APK文件,解析APK文件内容,获取应用权限包名等

通过上传的APK文件,解析APK文件内容,获取应用权限包名等 1工具导入: 下载aapt.exe反编译执行程序,放入Java工程资源文件夹下(具体路径自己可定义) 2编写ApkUtil类,获取apk文件信息 public class ApkUtil { public static final String VERSION_CODE = "versionCode"; public static final String VERSION_NAME = "versionName&q

第六章、epub文件处理 -- 解析container文件与.opf文件

第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderApp类的openBookInternal继续,开始介绍解析container文件与.opf文件. 这一章中会涉及到第二章.第四章.第五章中介绍的内容,大家可以互相参照,加深理解 首先,我们来回顾下第四章"epub文件处理 -- epub文件内部组成"的内容.我们在第四章中曾经介绍过,epub文内部包含的文件包括"container.xml文件..opf文

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

ElementTree 解析xml(minidom解析xml大文件时,MemoryError)

在使用minido解析xml文件时,因为文件过大,结果报错MemoryError.查询后得知是因为minidom在解析时是将所有文件放到内存里的,很占用内存,所以要考虑换一种方法来处理xml文件. ElementTree相比minidom消耗内存更小,下面是ElementTree的一些简单用法 XML源文件中的部分内容: #导入ElementTree from xml.etree import ElementTree #读入并解析XML文件,读入的是树形结构 doc = ET.parse(XML

PHP通过XML报文方式,已第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不