android解析plist檔案

yangxi_001發表於2013-11-27

plist,即property list,是蘋果手機軟體開發中經常用到的儲存檔案格式,其實質就是XML檔案,但是它遵循一定的格式。比如包含一些指定的元素,如plist,array,string,key等。蘋果提供瞭解析該類檔案的機制,可惜在安卓開發工具中卻沒有提供。經常遇到的情況是,在開發蘋果和安卓手機軟體的時候,要統一資原始檔,這個時候,我們可以採用GitHub中提供的開源android-plist-parser解決方案。

比如我們要解析一個全國省市區的一個plist檔案:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  3. <plist version="1.0">  
  4. <dict>  
  5.     <key>0</key>  
  6.     <dict>  
  7.         <key>北京市</key>  
  8.         <dict>  
  9.             <key>0</key>  
  10.             <dict>  
  11.                 <key>北京市</key>  
  12.                 <array>  
  13.                     <string>東城區</string>  
  14.                     <string>西城區</string>  
  15.                     <string>朝陽區</string>  
  16.                     <string>豐臺區</string>  
  17.                     <string>石景山區</string>  
  18.                     <string>海淀區</string>  
  19.                     <string>門頭溝區</string>  
  20.                     <string>房山區</string>  
  21.                     <string>通州區</string>  
  22.                     <string>順義區</string>  
  23.                     <string>昌平區</string>  
  24.                     <string>大興區</string>  
  25.                     <string>懷柔區</string>  
  26.                     <string>平谷區</string>  
  27.                     <string>密雲縣</string>  
  28.                     <string>延慶縣</string>  
  29.                 </array>  
  30.             </dict>  
  31.         </dict>  
  32.     </dict>  
  33.         ...  
  34.         ...  
  35.         ...  
  36. </dict>  
  37. </plist>  

那麼如何在android中解析呢?

一:在GitHub上下載android-plist-parser

https://github.com/tenaciousRas/android-plist-parser


二:解壓下載的包,並匯入android專案的類路徑裡。


三:解析該檔案,並將解析資訊列印在控制檯。(因為該檔案不算太小,因此在新執行緒中執行,防止主執行緒卡死)

  1. new Thread(new Runnable() {  
  2.         @Override  
  3.         public void run() {  
  4.             PListXMLParser parser = new PListXMLParser();                // 基於SAX的實現  
  5.             PListXMLHandler handler = new PListXMLHandler();  
  6.             parser.setHandler(handler);  
  7.               
  8.             try {  
  9.                 parser.parse(getAssets().open("area.plist"));        // area.plist是你要解析的檔案,該檔案需放在assets資料夾下  
  10.             } catch (IllegalStateException e) {  
  11.                 e.printStackTrace();  
  12.             } catch (IOException e) {  
  13.                 e.printStackTrace();  
  14.             }  
  15.               
  16.             PList actualPList = ((PListXMLHandler) parser.getHandler()).getPlist();  
  17.             Dict root = (Dict) actualPList.getRootElement();  
  18.   
  19.             Map<String,PListObject> provinceCities = root.getConfigMap();  
  20.                       
  21.             for(int i=0; i<provinceCities.keySet().size();i++) {  
  22.               
  23.                 Dict provinceRoot = (Dict) provinceCities.get(String.valueOf(i));     
  24.                 Map<String,PListObject> province = provinceRoot.getConfigMap();  
  25.                   
  26.                 String provinceName = province.keySet().iterator().next();  
  27.                 System.out.println("省份為:" + provinceName);                      // 列印省份  
  28.                   
  29.                 Dict cityRoot = (Dict) province.get(provinceName);  
  30.                   
  31.                 Map<String,PListObject> cities = cityRoot.getConfigMap();  
  32.                   
  33.                 for(int j=0;j<cities.keySet().size();j++) {  
  34.                     Dict city = (Dict) cities.get(String.valueOf(j));  
  35.                     String cityName = city.getConfigMap().keySet().iterator().next();  
  36.                     System.out.println("城市為:" + cityName);                      // 列印城市  
  37.                     Array districts = city.getConfigurationArray(cityName);  
  38.                     for(int k=0;k<districts.size();k++) {  
  39.                         com.longevitysoft.android.xml.plist.domain.String district = (com.longevitysoft.android.xml.plist.domain.String) districts.get(k);  
  40.                         System.out.println("地區為:" + district.getValue());       // 列印地區  
  41.                     }  
  42.                 }  
  43.                   
  44.             }  
  45.               
  46.         }  
  47.           
  48.     }).start();  

 

相關文章