我认为更有趣的问题是嵌套的NSArray
和NSDictionary
集合对象的合适组合,它最能代表Objective-C中的这个结构。然后,一旦你在嵌套集合对象中拥有它,你可以使用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]
是NSArray
,并@{key1:value1, key2:value2}
是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
来阅读它。
这是伟大的,谢谢你的时间! – dan