Http Получить plist в формате XML в массив или в файл, затем в массив?

Я заменяю простой initWithContentsOfURL: динамическим HttpGet, где я передаю два параметра, и эта веб-страница возвращает те же данные, что и XML в текстовом формате.

Должен ли я действительно анализировать данные, чтобы получить их в массив словарей? Я надеялся на NSXMLParser initWithData:, а затем на какой-нибудь автоматизированный способ инициализации NSArray со всеми узлами, структура которого соответствует XML. (Это plist в формате XML, поэтому структура и все имена ключей уже в нем. Почему я должен писать реплику всего этого еще и на Objective-C?!)

Я был бы счастлив, если бы httpполучил текстовый файл, а затем NSArray initWithContentsOfFile.

Изменить: это дает объект NSData размером 26 КБ, но сообщение об ошибке «Преобразование строки не удалось. Строка пуста».

//Initiate connection
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:url(aspurl)];
[request setHTTPMethod:@"GET"];
    //keep adding your headers this way
NSString *accept = [NSString stringWithFormat:@"application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/*;q=0.5"];
[request addValue:accept forHTTPHeaderField: @"Accept"];
    //send request & get response
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *errString;
NSMutableArray *arr=[NSPropertyListSerialization propertyListFromData:returnData
                                         mutabilityOption:NSPropertyListMutableContainers
                                                   format: NULL 
                             errorDescription:&errString];

if (errString)
{
    NSLog(@"%@",errString);
    [errString release]; // exception to the rules
}

Это дает ошибку «Преобразование строки не удалось. Строка пуста». и обр 0x0.

Кто-нибудь может указать на мою ошибку?


person Henrik Erlandsson    schedule 27.05.2011    source источник
comment
если вам нужен простой анализ, который приводит к словарям и массивам, и вы можете вносить изменения в API, используйте JSON с json-framework.   -  person Nick Weaver    schedule 27.05.2011


Ответы (1)


Во-первых, вы можете использовать такой класс, как XML-to-NSDictionary для анализа , и это может быть очень просто, но, похоже, вам не нравится такой подход.

Поскольку вы имеете дело с plist, в качестве альтернативы вы можете:

  1. используйте NSURLConnection для загрузки plist в NSData;
  2. используйте [NSPropertyListSerialization propertyListFromData:mutabilityOption:format:errorDescription:method], чтобы преобразовать это в NSDictionary/NSArray;

Также ознакомьтесь с Руководством по программированию списка свойств< /а>.

person sergio    schedule 27.05.2011
comment
Спасибо. Пробовал №2. Можете ли вы найти ошибку в моем отредактированном исходном сообщении? - person Henrik Erlandsson; 27.05.2011
comment
@Henrik: мне кажется, твой код подходит; единственное, что может быть с данными. Я бы попытался преобразовать NSData в NSString и проверить его содержимое: NSString *content = [[[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding] autorelease]; - person sergio; 27.05.2011
comment
Вставьте тот же URL-адрес в Safari, источник->XML-валидатор, ошибок не обнаружено. Обычно, если возникает ошибка с initWithContentsofURL (я делал это много раз с файлами plist-xml files), вы получаете пустой объект, но в этом приложении он работал с теми же данными. Возможно, не такое же поведение для NSURLRequest, но содержимое с вашим кодом (нулевое), если это лид. - person Henrik Erlandsson; 27.05.2011
comment
Можете ли вы попробовать initWithData указать NSASCIIStringEncoding в качестве кодировки? Извините за еще одну попытку, но если мы не можем получить XML из NSData в удобочитаемом виде, то вот проблема... - person sergio; 27.05.2011
comment
Только что сделал это ровно 13 секунд назад :D Это классика. Я предположил, что получил ту же кодировку, что и в файле из того же скрипта, то есть UTF-8. У сценариста в понедельник утром разболеется ухо... ;) Могу ли я временно сериализовать строку в файл и файл в NSArray? - person Henrik Erlandsson; 27.05.2011
comment
Странно, все, что мне нужно было сделать, это записать строку ascii в файл и выполнить {NSPropertyListSerialization propertyListFromData}, и список свойств был идеальным, а не-ascii-символы UTF-8, такие как å, отображались правильно. Правильный ответ отмечен и +1 за дополнительную помощь :) Хороших выходных! - person Henrik Erlandsson; 27.05.2011