Чтение из списка

#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);