Java解析含Array结构的.plist文件时遇空值问题求助
解决Commons Configuration 2.x读取带Array结构的.plist文件问题
我太懂你现在的困扰了——用Commons Configuration 2.x的XMLPropertyListConfiguration读plist时,只要里面有<array>标签,就拿不到dictionary节点下的内容,删掉array就正常,但目标文件又没法改结构。其实问题出在没适配plist数组结构的读取逻辑,我来帮你调整代码:
问题根源
你的plist结构里,dictionary对应的是一个<array>,真正的键值对容器<dict>藏在数组里面。而你原来的代码直接用plist.getKeys("dictionary"),是在找dictionary节点下的直接子键,但dictionary的直接子节点是array,不是具体的key,所以自然拿不到内容。
修正后的代码
import org.apache.commons.configuration2.ConfigurationException; import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.plist.XMLPropertyListConfiguration; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileNotFoundException; import java.util.Iterator; import java.util.List; public void parsePlist(File f) throws ConfigurationException, FileNotFoundException { XMLPropertyListConfiguration plist = new XMLPropertyListConfiguration(); // 加载plist文件,建议后续改成指定UTF-8编码避免乱码问题 BufferedReader br = new BufferedReader(new FileReader(f)); plist.read(br); // 获取dictionary对应的array下的所有dict配置实例 List<HierarchicalConfiguration> dictConfigs = plist.configurationsAt("dictionary"); // 遍历数组里的每个dict节点 for (HierarchicalConfiguration config : dictConfigs) { // 获取当前dict下的所有key Iterator<String> keys = config.getKeys(); while (keys.hasNext()) { String key = keys.next(); String value = config.getString(key); System.out.println(key + ": " + value); } } }
代码说明
configurationsAt("dictionary")方法会返回dictionary节点下所有数组元素的配置对象,也就是每个<dict>对应的配置实例。- 遍历这些配置实例后,再用
getKeys()就能拿到每个dict里的所有键,进而获取对应的值。 - 如果你的array里有多个
<dict>,这段代码也能逐个处理,完全适配你的plist结构。
要是你只需要获取某个特定key的值,比如key1,可以简化成这样:
for (HierarchicalConfiguration config : dictConfigs) { String value1 = config.getString("key1"); System.out.println("key1的值:" + value1); }
内容的提问来源于stack exchange,提问作者Tobias Schäfer
相关产品推荐
相关产品推荐

