2009-07-02 20 views
26

Tengo una cadena plist estructurada, que se obtiene dinámicamente (no desde el sistema de archivos). ¿Cómo convertiría esta cadena a un NSDictionary?Parse Plist (NSString) en NSDictionary

He intentado convertir NSData y luego en un NSDictionary con NSPropertyListSerialization, pero devuelve "[NSCFString objectAtIndex:]: selector no reconocido enviado a la instancia 0x100539f40" cuando intento acceder al NSDictionary, mostrando que mi Dictionary was not creado con éxito

Ejemplo de la NSString (es decir, los datos de 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> 

Gracias!

Respuesta

72

Ver 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 Su solución parece muy bien pulida, usando inmutables para crear un NSDictionary y recordando lanzar el error si hay uno que valga puntos de bonificación. :-) –

+0

Casi llamé a eso un sobre-lanzamiento. Um, wow. Esa API viola por completo las reglas de administración de memoria al requerir que la persona que llama libere esa cadena de error. –

+0

De acuerdo con las Notas de la versión, cambió para no tener esa infracción en Leopard. Vale la pena buscar. Hay un informe de error al respecto: http://openradar.appspot.com/5563963 –

12

Prueba esto:

NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding]; 

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

¡Perfecto! ¡Gracias! – christo16

+0

Excepto por la pérdida de memoria, pero diablos sucede (: – Jacob

+0

NSDictionary * dict = (NSDictionary *) [NSPropertyListSerialization ...... Necesita verificar el archivo que está tratando de leer, ya que puede devolver un NSArray en lugar de 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.

No, no muestra tal cosa. Lo que muestra es que trataste de tratar una cadena como una matriz. Tendrías que determinar en qué lugar de la lista intentabas obtener una matriz y por qué había una cadena donde esperabas una matriz, es decir, si creaste la lista incorrectamente (poniendo una cadena en la que querías poner una matriz) o lo están examinando incorrectamente (la presencia de una cadena es correcta, su expectativa posterior de una matriz es incorrecta).