android解析plist文件

plist,即property list,是苹果手机软件开发中经常用到的存储文件格式,其实质就是XML文件,但是它遵循一定的格式。比如包含一些指定的元素,如plist,array,string,key等。苹果提供了解析该类文件的机制,可惜在安卓开发工具中却没有提供。经常遇到的情况是,在开发苹果和安卓手机软件的时候,要统一资源文件,这个时候,我们可以采用GitHub中提供的开源android-plist-parser解决方案。

比如我们要解析一个全国省市区的一个plist文件:

 

[html][/html] view plaincopy

  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项目的类路径里。

 

三:解析该文件,并将解析信息打印在控制台。(因为该文件不算太小,因此在新线程中运行,防止主线程卡死)

 

[java][/java] view plaincopy

  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.             try {
  8.                 parser.parse(getAssets().open(“area.plist”));        // area.plist是你要解析的文件,该文件需放在assets文件夹下
  9.             } catch (IllegalStateException e) {
  10.                 e.printStackTrace();
  11.             } catch (IOException e) {
  12.                 e.printStackTrace();
  13.             }
  14.             PList actualPList = ((PListXMLHandler) parser.getHandler()).getPlist();
  15.             Dict root = (Dict) actualPList.getRootElement();
  16.             Map<String,PListObject> provinceCities = root.getConfigMap();
  17.             for(int i=0; i<provinceCities.keySet().size();i++) {
  18.                 // 因为省份的key是从小到大排序的
  19.                 Dict provinceRoot = (Dict) provinceCities.get(String.valueOf(i));
  20.                 Map<String,PListObject> province = provinceRoot.getConfigMap();
  21.                 String provinceName = province.keySet().iterator().next();
  22.                 System.out.println(“省份为:” + provinceName);                      // 打印省份
  23.                 Dict cityRoot = (Dict) province.get(provinceName);
  24.                 Map<String,PListObject> cities = cityRoot.getConfigMap();
  25.                 for(String key : cities.keySet()) {
  26.                     System.out.println(key);
  27.                 }
  28.                 for(int j=0;j<cities.keySet().size();j++) {
  29.                     Dict city = (Dict) cities.get(String.valueOf(j));
  30.                     String cityName = city.getConfigMap().keySet().iterator().next();
  31.                     System.out.println(“城市为:” + cityName);                      // 打印城市
  32.                     Array districts = city.getConfigurationArray(cityName);
  33.                     for(int k=0;k<districts.size();k++) {
  34.                         com.longevitysoft.android.xml.plist.domain.String district = (com.longevitysoft.android.xml.plist.domain.String) districts.get(k);
  35.                         System.out.println(“地区为:” + district.getValue());       // 打印地区
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.     }).start();

 

area.plist放在我的资源里,需要的可以在这里下载。

标签