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
希望以上代码对大家有所帮助!