我認爲更有趣的問題是嵌套的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