2009-07-02 14 views
26

Tak więc mam ciąg struktury structst, który pobiera dynamicznie (nie z systemu plików). Jak przekonwertować ten ciąg do NSDictionary.Parse Plist (NSString) do NSDictionary

Próbowałem konwertować NSData, a następnie do NSDictionary z NSPropertyListSerialization, ale zwraca "[NSCFString objectAtIndex:]: nierozpoznany selektor wysłany do instancji 0x100539f40", gdy próbuję uzyskać dostęp do NSDictionary, pokazując, że mój słownik nie był pomyślnie utworzony.

Przykład NSString (czyli dane 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> 

Dzięki!

Odpowiedz

72

Zobacz Serializing a Property List

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]; 
} 
+4

+1 Twoje rozwiązanie wydaje się ładnie dopracowane - używanie niezmiennych do tworzenia NSDictionary i pamiętanie o zwolnieniu błędu, jeśli jest jeden, są warte dodatkowych punktów. :-) –

+0

Niemal nazwałem to nadmiernym zwolnieniem. Um, wow. Ten interfejs API całkowicie narusza reguły zarządzania pamięcią, wymagając od wywołującego zwolnienia tego ciągu błędów. –

+0

Zgodnie z Informacjami o wersji zmieniono to, aby nie było tego naruszenia w systemie Leopard. Warto zwrócić uwagę. Istnieje zgłoszenie błędu na ten temat: http://openradar.appspot.com/5563963 –

12

Spróbuj tego:

NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding]; 

NSString *errorDesc = nil; 
NSPropertyListFormat format; 
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization 
             propertyListFromData:data 
             mutabilityOption:NSPropertyListMutableContainersAndLeaves 
             format:&format 
             errorDescription:&errorDesc]; 
+0

Idealny! Dzięki! – christo16

+0

Z wyjątkiem wycieku pamięci, ale do cholery, tak się dzieje (: – Jacob

+0

NSDictionary * dict = (NSDictionary *) [NSPropertyListSerialization ...... Musisz sprawdzić plik, który próbujesz odczytać, ponieważ możesz zwrócić NSArray zamiast NSDictionary: – Komposr

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.

Nie, to nie wykazuje takiego. Pokazuje, że próbowałeś traktować ciąg jako tablicę. Musisz określić, gdzie w pliku plist masz próbę uzyskać tablicę i dlaczego był ciąg znaków, w którym oczekiwałeś tablicy - tj. Czy plik plist został utworzony niepoprawnie (wstawiając ciąg znaków do tego, co chciałeś umieścić tablica) lub badają go niepoprawnie (obecność ciągu znaków jest poprawna, a kolejne oczekiwanie na tablicę jest nieprawidłowe).