天天看點

pull解析與生成xml檔案

大家晚上好,今天給大家講解的是pull解析與生成xml檔案,這主要有兩個效果,其一,将完整格式的xml解析,在listView清單顯示,這個知識點就要運用上幾講關于擴充卡知識點來做,其二,自己定義标準格式的xml檔案,生成并發放在内部儲存中。

pull解析與生成xml檔案

由于這次的代碼比較多,我主要講解關鍵的代碼,其他布局什麼的,就不講,有不懂可以是底下問我。

1.PullActivity.java

private ListView bookList;

 private List<Map<String, Object>> data;

 private Context context;

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_pull);

  bookList = (ListView) findViewById(R.id.list);

  context = this;

  try {

   //用輸入流擷取asset下的xml檔案

   InputStream is = getAssets().open("book.xml");

   //調用業務層方法,方法的結果存在List的data值裡

   data = fileManager.parse(is);

   //建立簡單型擴充卡,參數一:上下文,參數二:要存的資料 參數三:layout布局  ,參數四:從哪裡來,key值 ,參數五:到哪裡去,布局對應的Id

   SimpleAdapter adapter = new SimpleAdapter(this, data,

     R.layout.item_list, new String[] { "name", "price" },

     new int[] { R.id.name_et, R.id.price_et });

   //設定擴充卡,展示資料

   bookList.setAdapter(adapter);

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 public void export(View v) {

  try {

   //擷取導入的路徑,getFilesDir()

   File rootPath = context.getFilesDir();

   //建立檔案,參數一:路徑 ,參數二:xml命名

   File file = new File(rootPath, "new2.xml");

  //輸出流寫入資料

   FileOutputStream fos = new FileOutputStream(file);

   Toast.makeText(context, "導入成功", Toast.LENGTH_SHORT).show();

//調用業務層的方法,傳的參數是,data,fos,

   fileManager.export(data, fos);

  } catch (Exception e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

2.fileManager.java  業務層,主要書寫方法

//定義聲明

private static final String BOOK = "book";

 private static final String BOOKS = "books";

 private static final String NAME = "name";

 private static final String ID = "id";

 private static final String PRICE = "price";

 public static List<Map<String, Object>> parse(InputStream is)

   throws Exception {

  List<Map<String, Object>> data = null;

  HashMap<String, Object> map = null;

//建立解析器

  XmlPullParser parser = Xml.newPullParser();

  //設定編碼方式

  parser.setInput(is, "utf-8");

  //擷取xml類型

  int eventType = parser.getEventType();

 //當條件滿足時,開始執行循環

  while (eventType != XmlPullParser.END_DOCUMENT) {

 //switch case 判斷

   switch (eventType) {

  //開始文檔

   case XmlPullParser.START_DOCUMENT:

    //初始化儲存的清單

    data = new ArrayList<Map<String, Object>>();

    break;

   //開始标簽

   case XmlPullParser.START_TAG:

    //得到開始标簽下的屬性值

    String name = parser.getName();

    //逐一開始判斷,

  //屬性值的BOOK時

    if (name.equals(BOOK)) {

     map = new HashMap<String, Object>();

    //得到id值

     String id = parser.getAttributeValue(0);

     map.put(ID, Integer.valueOf(id));

    //屬性值Name時

    } else if (name.equals(NAME)) {

     map.put(NAME, parser.nextText());

//屬性值為PRICE時

    } else if (name.equals(PRICE)) {

     map.put(PRICE, parser.nextText());

    }

    break;

   //結束标簽

   case XmlPullParser.END_TAG:

    if (parser.getName().equals(BOOK)) {

 //添加到清單中

     data.add(map);

    }

    break;

   default:

    break;

   }

//最關鍵的地方,每次都要在往下執行一次

   eventType = parser.next();

  }

傳回已有資料的data值

  return data;

 }

 public static void export(List<Map<String, Object>> data,

   FileOutputStream fos) throws Exception {

  //建立序号器,它有個特點,有了開始,必定有結束

  XmlSerializer serializer = Xml.newSerializer();

  //輸出流的格式

  serializer.setOutput(fos, "utf-8");

 //開始文檔

  serializer.startDocument("utf-8", true);

 //開始标簽,開始的标簽的命名為BOOKS

  serializer.startTag(null, BOOKS);

 //用map集合進行data周遊

  for (Map map : data) {

   //下一個開始标簽BOOK

   serializer.startTag(null, BOOK);

   //設定屬性ID,用map得到id的實際值

   serializer.attribute(null, ID, map.get(ID).toString());

   //下一個開始标簽,NAME

   serializer.startTag(null, NAME);

   //設定文本值

   serializer.text(map.get(NAME).toString());

   serializer.endTag(null, NAME);

 //設定下一個開始标簽PRICE

   serializer.startTag(null, PRICE);

   //設定PRICE值

   serializer.text(map.get(PRICE).toString());

//結束标簽

   serializer.endTag(null, PRICE);

   serializer.endTag(null, BOOK);

  }

  //結束标簽有頭也有尾

  serializer.endDocument();

  serializer.endTag(null, BOOKS);

  //關閉輸出流

  fos.close();

 }

pull解析與生成就到這裡,為什麼要詳細講解這個解析呢,因為在我們做開發的時候,解析與生成xml最常用的方法就是pull,大家好好看看這篇部落格,相信能給大家以後開發項目有用。時間過得很快,淩晨十二點多了,該洗洗睡,熬夜傷身,養好身體才有精力敲代碼。晚安。