疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

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


 

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

 
Pull XML解析器早已经被google集成到android sdk当中,它是google官方推荐的解析器。
 
如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和解析xml文件,需要用到kxml2;
 
实验开始:
 
在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