Как преобразовать nsstring в nsdictionary? - PullRequest
0 голосов
/ 27 октября 2009

Я прошел через следующий вопрос.

Конвертировать NSString в NSDictionary

Это нечто иное, чем мой вопрос.

У меня следующий вопрос.

NSString *x=@"<Category_Id>5</Category_Id><Category_Name>Motos</Category_Name><Category_Picture>http://192.168.32.20/idealer/admin/Picture/icon_bike2009819541578.png</Category_Picture>";

Теперь я хочу преобразовать это в словарь, что-то вроде этого,

dictionary key = Category_Id      | value = 5 
dictionary key = Category_Name    | value = ???
dictionary key = Category_Picture | value = ???

Я не знаю, как это сделать.

Ответы [ 3 ]

7 голосов
/ 28 октября 2009

Не самая быстрая реализация, но это поможет (и не требует никаких сторонних библиотек):

@interface NSDictionary (DictionaryFromXML)

+ (NSDictionary *)dictionaryFromXML:(NSString *)xml;

@end

@implementation NSDictionary (DictionaryFromXML)

+ (NSDictionary *)dictionaryFromXML:(NSString *)xml
{
  // We need to wrap the input in a root element
  NSString *x = [NSString stringWithFormat:@"<x>%@</x>", xml];

  NSXMLDocument *doc = [[[NSXMLDocument alloc] initWithXMLString:x
                                                         options:0
                                                           error:NULL]
                         autorelease];

  if (!doc)
    return nil;

  NSMutableDictionary *dict = [NSMutableDictionary dictionary];

  for (NSXMLElement *el in [[doc rootElement] children])
    [dict setObject:[el stringValue] forKey:[el name]];

  return dict;
}

@end
5 голосов
/ 27 октября 2009

Если это XML, тогда вы можете использовать NSXMLParser. Если это не так, вы можете написать свой собственный парсер.

4 голосов
/ 27 октября 2009

Вы можете сделать это с помощью регулярного выражения ... Что-то вроде <([^>]+)>([^<]+)</\1> будет захватывать ключ в захват 1 и значение в захват 2. Итерировать совпадения и строить словарь.

Используется RegexKitLite :

NSString  * x = @"<Category_Id>5</Category_Id><Category_Name>Motos</Category_Name><Category_Picture>http://192.168.32.20/idealer/admin/Picture/icon_bike2009819541578.png</Category_Picture>";
NSString * regex = @"<([^>]+)>([^<]+)</\\1>";
NSArray * cap = [x arrayOfCaptureComponentsMatchedByRegex:regex];
NSMutableDictionary * d = [NSMutableDictionary dictionary];
for (NSArray * captures in cap) {
    if ([captures count] < 3) { continue; }
    NSString * key = [captures objectAtIndex:1];
    NSString * value = [captures objectAtIndex:2];
    [d setObject:value forKey:key];
}
NSLog(@"%@", d);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...