1. 程式人生 > >Java之Pull方式生成xml檔案和解析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資料夾,拷貝從網上下載的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

希望以上程式碼對大家有所幫助!