Вопрос по cocoa, xml, parsing, objective-c – Разбор Plist (NSString) в NSDictionary

26

Итак, у меня есть структурированная строка plist, которая получается динамически (не из файловой системы). Как бы я преобразовать эту строку в NSDictionary.

Я пытался преобразовать его NSData, а затем в NSDictionary с NSPropertyListSerialization, но он возвращает «[NSCFString objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x100539f40»; когда я пытаюсь получить доступ к NSDictionary, показывая, что мой словарь не был успешно создан.

Пример строки NSString (то есть данных 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"> 
<dict> 
 <key>Key1</key> 
 <dict> 
  <key>Test1</key> 
  <false/> 
  <key>Key2</key> 
  <string>Value2</string> 
  <key>Key3</key> 
  <string>value3</string> 
 </dict> 
</dict> 
</plist> 

Спасибо!

Ваш Ответ

3   ответа
1

I've tried converting it NSData and then to a NSDictionary with NSPropertyListSerialization, but it returns "[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x100539f40" when I attempt to access the NSDictionary, showing that my Dictionary was not successfully created.

Нет, это не показывает ничего подобного. Это показывает, что вы пытались обработать строку как массив. Вам нужно определить, в каком месте в plist вы пытались получить массив и почему там была строка, в которой вы ожидали массив - т.е., правильно ли вы создали plist (putting строка, в которую вы намеревались поместить массив) или вы проверяете ее неправильно (наличие строки является правильным; ваше последующее ожидание массива неверно).

12

Попробуй это:

NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

NSString *errorDesc = nil;
NSPropertyListFormat format;
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization
                                      propertyListFromData:data
                                      mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                      format:&format
                                      errorDescription:&errorDesc];
NSDictionary * dict = (NSDictionary *) [NSPropertyListSerialization ...... Вам необходимо проверить файл, который вы пытаетесь прочитать, поскольку вы, возможно, возвращаете NSArray вместо NSDictionary.
За исключением утечки памяти, но, черт возьми, это происходит (:
Отлично! Спасибо! christo16
72

УвидетьСериализация списка свойств

NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding];
NSString *error;
NSPropertyListFormat format;
NSDictionary* plist = [NSPropertyListSerialization propertyListWithData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
NSLog( @"plist is %@", plist );
if(!plist){
    NSLog(@"Error: %@",error);
    [error release];
}
+1 Ваше решение выглядит отлично отшлифованным & # x2014; использование immutable для создания NSDictionary и запоминание сообщения об ошибке, если оно есть, приносят бонусные баллы. :-)
Насколько я понимаю, документация верна, а примечания к выпуску (сейчас) неверны, так как Apple решила оставить утечку из соображений совместимости.
Этот метод теперь устарел, и вы должны использовать propertyListWithData: options: format: error: вместо этого.
Я почти назвал это переизданием. Ого Этот API полностью нарушает правила управления памятью, требуя от вызывающей стороны освободить эту строку ошибки.
В соответствии с примечаниями к выпуску, он изменился, чтобы не допустить такого нарушения в Leopard. Стоит высматривать. Об этом есть сообщение об ошибке:openradar.appspot.com/5563963

Похожие вопросы