Java之Pull方式生成xml檔案和解析xml檔案
阿新 • • 發佈:2019-01-29
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
希望以上程式碼對大家有所幫助!