#objective-c #nsarray #plist
#objective-c #nsarray #список
Вопрос:
Я пытаюсь научиться читать из списка … мой случай простой. На самом деле я просто хочу прочитать одно целое число, хотя для более общего случая данных я также был бы признателен за совет. В списке есть массив Item0, а под этим элементом 0 с номером. Вот как я пытаюсь это прочитать.
plistArray = [[NSArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.website.com/count.plist"]];
//count = [[plistArray objectAtIndex:0]];
count=(int)[plistArray objectAtIndex:0];
NSLog(@"array %@n",plistArray);
NSLog(@"count %in",count);
Это XML-файл plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "apple.com/DTDs/PropertyList-1.0.dtd">
;<plist version="1.0">
<dict>
<key>Item0</key>
<array>
<integer>12</integer>
</array>
</dict>
</plist>
Комментарии:
1. как бы то ни было … количество равно нулю, а массив равен нулю в журнале.
2. Если массив выводит nil, либо URL неверен, либо формат списка неверен. Создайте NSURL в отдельной строке (например,
NSURL *url = [NSURL URLWithString...
) передNSArray alloc
строкой и посмотрите,url
получается nil или нет. Если URL в порядке, опубликуйте XML-файл списка. Кроме того, NSArrays содержат объекты, поэтомуcount
присвоение неверно (int — это примитивный тип). Если первый элемент является целым числом, это будет как объект NSNumber, поэтому вам нужно будет сделатьcount = [(NSNumber *)[plistArray objectAtIndex:0] intValue];
.3. <?xml version=»1.0″ encoding=»UTF-8″?> <!DOCTYPE plist PUBLIC «-//Apple//DTD PLIST 1.0//RU» » apple.com/DTDs/PropertyList-1.0.dtd «> <версия списка=»1.0»> <dict> <ключ>Item0</ключ> <массив> <целое число> 12</integer> </array> </dict> </plist>
4. URL печатается нормально… итак, как вы сказали, это должно быть связано с тем, как я обрабатываю список. Я вставил это выше… это выглядит довольно беспорядочно, но в этом нет ничего особенного. Спасибо за помощь.
Ответ №1:
В списке есть две проблемы:
;
перед<plist>
тегом не должно быть- массив, который вы пытаетесь прочитать в своем коде, находится внутри словаря в списке (массив не является самым внешним элементом)
Сначала удалите точку с запятой.
Далее, либо обновите список, чтобы он содержал только <array>
элемент, либо обновите код, чтобы сначала прочитать <dict>
, а затем взять NSArray
из словаря:
NSDictionary *plistDict = [NSDictionary dictionaryWithContentsOfURL:url];
NSArray *plistArray = [plistDict objectForKey:@"Item0"];
int count = [(NSNumber *)[plistArray objectAtIndex:0] intValue];
Ответ №2:
В качестве корневого объекта вашего списка используется словарь, а не массив. Вы должны создать NSDictionary с содержимым URL, тогда он будет содержать массив (для ключевого элемента 0), и первым объектом этого массива будет ваш NSNumber, содержащий целое число.
Ответ №3:
Я не уверен, как вы создаете список, но я думаю, что вы сохраняете NSDictionary, а не NSArray.
Структура данных в списке показывает, что корневым объектом является dictionary (dict), который содержит одну пару ключ / значение. Ключом является «Item0», а значением является NSArray, который, я думаю, вы ищете.
Попробуйте это:
plistDict = [[NSDictionary alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.website.com/count.plist"]];
NSArray * plistArray = [plistDict objectForKey:@"Item0"];
NSLog(@"array %@", plistArray);