標籤:xml pull kxml java
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標籤的子標籤 contentserializer.startTag(null, "content");serializer.text(wisdom.getContent());serializer.endTag(null, "content");// 設定wisdom標籤的子標籤的ageserializer.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
希望以上代碼對大家有所協助!
Java之Pull方式產生xml檔案和解析xml檔案