与其纠缠于 plist 格式,我认为更有趣的问题是,在 Objective-C 中最能代表这种结构的嵌套对象NSArray
和集合对象的适当组合是什么。NSDictionary
然后,一旦你在嵌套的集合对象中拥有它,你就可以使用该writeToFile
方法自动生成 plist 文件。
现在您说您不想要“每个带有属性的标签的数组”。首先,我不会建议使用数组,但实际上我会建议使用字典。其次,这正是我认为您想要的,每个标签的一致、可理解的表示。第三,我建议您不仅对具有属性的标签这样做,而且我什至可能对所有标签都这样做。
我不知道你为什么说你不想为每个标签使用一个数组,但是虽然它可能看起来效率低下,但事实证明这样做要容易得多,因为这样你的结构将保持一致、简单使用格式。
最简单的解决方案是为 XML 源代码中的每个元素创建一个字典,一个键是@"value"
另一个键(如果没有,则@"attributes"
可以省略)。attributes
想象以下 XML:
<produce>
<product>
<name language="English">Apple</name>
<price currency="USD">1.23</price>
<color>red</color>
</product>
<product>
<name language="English">Banana</name>
<price currency="USD">2.63</price>
<color>yellow</color>
</product>
</produce>
我建议您拥有一系列产品,其中每个产品都是一个NSDictionary
带有三个键、name
、price
和color
. 这三个的值本身就是NSDictionary
对象,但有两个键value
,如果合适的话,还有attributes
. 因此,如果您要在代码中手动表示生成的一系列嵌套对象,它可能看起来像(其中,@[a, b, c]
是 aNSArray
和@{key1:value1, key2:value2}
是 a NSDictionary
):
NSArray *array = @[
@{
@"name":
@{
@"value" : @"Apple",
@"attributes" : @{@"language":@"English"}
},
@"price":
@{
@"value" : @1.23,
@"attributes" : @{@"currency":@"USD"}
},
@"color":
@{
@"value" : @"red"
}
},
@{
@"name":
@{
@"value" : @"Banana",
@"attributes" : @{@"language":@"English"}
},
@"price":
@{
@"value":@1.46,
@"attributes":@{@"currency":@"USD"}
},
@"color":@{@"value":@"yellow"}
}
];
虽然这看起来很复杂,但它实际上非常容易使用。如果你想要第二个对象,那就是array[1]
. 如果你想要第二个对象的颜色,它会是array[1][@"color"][@"value"]
. 如果您想要第一个对象的语言名称,那就是array[0][@"name"][@"attributes"][@"language"]
. 一旦你开始使用这个嵌套的集合对象结构,你就会明白 (a) 为什么我更喜欢字典而不是数组;还有为什么(b)无论是否存在属性,我都使用相同的字典结构,这样检索值的过程始终是一致的。
无论如何,如果我现在使用该writeToFile
方法,那恰好会产生一个像这样的 plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>color</key>
<dict>
<key>value</key>
<string>red</string>
</dict>
<key>name</key>
<dict>
<key>attributes</key>
<dict>
<key>language</key>
<string>English</string>
</dict>
<key>value</key>
<string>Apple</string>
</dict>
<key>price</key>
<dict>
<key>attributes</key>
<dict>
<key>currency</key>
<string>USD</string>
</dict>
<key>value</key>
<real>1.23</real>
</dict>
</dict>
<dict>
<key>color</key>
<dict>
<key>value</key>
<string>yellow</string>
</dict>
<key>name</key>
<dict>
<key>attributes</key>
<dict>
<key>language</key>
<string>English</string>
</dict>
<key>value</key>
<string>Banana</string>
</dict>
<key>price</key>
<dict>
<key>attributes</key>
<dict>
<key>currency</key>
<string>USD</string>
</dict>
<key>value</key>
<real>1.46</real>
</dict>
</dict>
</array>
</plist>
但好消息是,我不必自己编写 plist。我只是将 XML 加载到我的嵌套数组和字典结构中,然后用于writeToFile
生成 plist 文件。当我想使用该 plist 时,现在只需调用arrayWithContentsOfFile
.