美文网首页Android爬坑日记
Android中解析plist文件使用dd-plist插件,完成

Android中解析plist文件使用dd-plist插件,完成

作者: 小蘑菇的驼羊 | 来源:发表于2017-06-21 00:08 被阅读822次

    由于项目的需求,需要一个省市的二级联动,本来已经做好了,最后传值的时候发现绑定不成功。当时就郁闷了。最后发现问题出在我的省市文件了。。。作者之前用的读取txt文本(json格式的)使用Gson转化成javabean。。。然后问了问,发现iOS哪儿有省市文件,为了保持统一就从那边弄了一份,看了一下是plist。哎、、、不知道怎么办,上网搜了搜,各种抄袭啊!代码什么的都一样,这样的环境真的好吗?这样的方式真的好吗???大家都在使用android-plist-parser。各种文章啊,打开一看代码一模一样,有意思吗???

    今天给大家介绍一个新的解析plist的插件,貌似是谷歌提供的,叫做:googlecode.plist:dd-plist。

    在android studio中直接使用:compile'com.googlecode.plist:dd-plist:1.16' 这样就引入项目了。然后可以愉快地使用了。

    如下图所示:

    使用dd-plist代码部分

    其中本人使用的plist中state:省份  ;cities:城市

    省份的获取没问题,主要问题出在了城市的获取。本人想的是,将省份,与城市绑定在一个list中。

    先用NSArray ary获取到当前的索引下的数据信息。之后使用NSDictionary转化为字典类型。然后使用字典类型下的objectForKey的方法获取到键名为“cities”的数据信息。这个时候他还是NS类型的,使用toJavaObject转化为java格式下的类型。因为城市,肯定是一个array,使用Object[]接受,之后使用的时候使用强制转换就可以了。

    Tuple<String,List<String>> 这个是引入了C#中的元组概念,方便我们来回的存储数据。大致是这个样子的:

    Tuple可以扩展很多的

    没有办法插入plist文件。。。。截图表示吧。

    plist--1 plist--2

    获取到了省份,城市的数据了,之后的事情就简单了, 使用spinner获取到省份的列表,之后再setOnItemSelectedListener中根据点击的postion获取到allList中对应的位置的省下面的city列表

    spinner根据position获取到cityList代码

    这样就搞定了!

           2017/11/10更新一下。目前dd-plist插件已经升级到了1.20。在此版本下内部方法有些不同了。上面只是说了array下面有个dict的情况,下面来说一下这种情况:

    ok,开头现在项目的build文件中添加依赖:

    compile group:'com.googlecode.plist', name:'dd-plist', version:'1.20'

    最新版的写法。。。。

    在此文件中,key:dataSource,value:array。在这个array中,装入的是字典(dict)。

    下面是新版的解决办法:

    ```

    NSArray ary = (NSArray) PropertyListParser.parse(getAssets().open("new.plist"));

    for(inti =0;i < ary.count();i++) {//遍历当前NSArray

    //将当前遍历的结果也是字典。将其存放入dic(字典)中保存

    NSDictionary dic = (NSDictionary) ary.objectAtIndex(i);

    //获取key:project的value值。

    String project = (dic.objectForKey("project")).toJavaObject().toString();

    //获取key:dataSource的value。

    // 分析plist文件得到value为array类型(每一个数据是NSDictionary类型)

    NSArray tmpAry = (NSArray) dic.objectForKey("dataSource");

    for(intj =0;j < tmpAry.count();j++) {

    NSDictionarysecDic= (NSDictionary) tmpAry.objectAtIndex(j);

    String name = (secDic.objectForKey("name")).toJavaObject().toString();

    String sex = (secDic.objectForKey("sex")).toJavaObject().toString();

    String birthday = (secDic.objectForKey("birthday")).toJavaObject().toString();

    String others = (secDic.objectForKey("others")).toJavaObject().toString();

    }

    }

    ```

    图片版

    不会排版。。。。。求赐教。。。。。

    这样就解析出来了,array中的dict嵌套一个array

    现在已经获得了value,接下来的工作,就要自己开始思考了

    相关文章

      网友评论

      • 23a9e831a875:这个是真的棒
      • 清风惊残梦:如果cities的array里面还有几个键值应该怎么取呢?
        小蘑菇的驼羊:@tanqingshan 你少打了个</plist>。这个问题也不难,由于dd-plist在不断地升级翻看之后发现NSObject中并不存在wrap方法。文章中写的可能有点啰嗦,方法复杂。现在有个好方法。
        1.先使用NSArray接收到解析出来的plist文件。
        2.将array使用NSDictionary对象存放。
        3.获取NSDictionary的键名,从而取得value值
        4.分析value值得类型,看他是个字符串还是个array。如果是array的话,接着使用NSArray接收
        NSArray ary = (NSArray) PropertyListParser.parse(getAssets().open("new.plist"));
        for (int i = 0; i < ary.count(); i++) {//遍历当前NSArray
        //将当前遍历的结果也是字典。将其存放入dic(字典)中保存
        NSDictionary dic = (NSDictionary) ary.objectAtIndex(i);
        //获取key:project的value值。
        String project = (dic.objectForKey("project")).toJavaObject().toString();
        _list.add(project);
        //获取key:dataSource的value。
        // 分析plist文件得到value为array类型(每一个数据是NSDictionary类型)
        NSArray tmpAry = (NSArray) dic.objectForKey("dataSource");
        for (int j = 0; j < tmpAry.count(); j++) {
        NSDictionary secDic = (NSDictionary) tmpAry.objectAtIndex(j);
        String name = (secDic.objectForKey("name")).toJavaObject().toString();
        String count = (secDic.objectForKey("count")).toJavaObject().toString();
        String danwei = (secDic.objectForKey("danwei")).toJavaObject().toString();
        String beizhu = (secDic.objectForKey("beizhu")).toJavaObject().toString();
        _listSec.add("name: " + name + " count: " + count + " danwei: " + danwei + " beizhu: " +
        beizhu);
        }
        }
        清风惊残梦:@小蘑菇的驼羊
        文档地址:https://3breadt.github.io/dd-plist/
        文档里好像没有wrap这个方法。我不知道怎么将将Object[]对象转化为一个NSArray对象
        需要读的数据格式如下:
        <plist version="1.0">
        <array>
        <dict>
        <key>project</key>
        <string>挡潮泄洪闸</string>
        <key>dataSource</key>
        <array>
        <dict>
        <key>name</key>
        <string>形式</string>
        <key>count</key>
        <string></string>
        <key>danwei</key>
        <string></string>
        <key>beizhu</key>
        <string>胸墙式</string>
        </dict>
        <dict>
        <key>name</key>
        <string>地基岩式</string>
        <key>count</key>
        <string></string>
        <key>danwei</key>
        <string></string>
        <key>beizhu</key>
        <string>劣质粉土</string>
        </dict>
        </array>
        </dict>
        </array>
        小蘑菇的驼羊:如果在cities的array中又嵌套一个dictionary的话。可以使用NSObject.wrap(obj),将Object[]对象转化为一个NSArray对象,之后使用循环,再使用((NSDictionary) ary.objectAtIndex(i)).objectForKey("你的plist文件中的键值").toJavaObject().toString();得到你想要的数据。类似于截图中的获取cities,以及states的代码一样。只是将一个Object[]对象转化为了NSArray对象。
      • 小蘑菇的驼羊:对map的理解太不深刻了。。。哎。。。简单的问题困扰了半天

      本文标题:Android中解析plist文件使用dd-plist插件,完成

      本文链接:https://www.haomeiwen.com/subject/eutzqxtx.html