разобрать xml в NSMutableDictionary - PullRequest
       37

разобрать xml в NSMutableDictionary

0 голосов
/ 11 октября 2011

В настоящее время я пытаюсь проанализировать некоторые данные XML в NSDictionary. Это первый раз, когда я попробовал что-то подобное, и немного не уверен в том, что я делаю,

Прежде всего, я анализирую некоторый XML, который выглядит примерно так -

<Rows>
<Row ID="76" MANF="JARD" ISMANUF="F" ISSER="F"/>
<Row ID="38" MANF ="SANBIN" ISMANUF ="F" ISSER ="T"/>
<Rows>

Я использую NSXMLParser делегатов, поэтому использую NSLog

NSLog(@"attributes: %@", attributeDict);

on parser:didStartElement:namespaceURI:qualifiedName:attributes: метод делегата и мой вывод выглядит следующим образом.

}
2011-10-11 08:01:15.472 Code[526:207] attributes: {
    ISMANUF = F;
    ISSER = T;
    MANF = smart;
    ID = 74;
}
2011-10-11 08:01:15.472 Code[526:207] attributes: {
    ISMANUF = F;
    ISSER = T;
    MANF = "weather guard";
    ID = 71;
}

Я сейчас пытаюсь разобрать все это в NSMutableDictionary, но не совсем уверен, как это сделать ... Я собираюсь сделать что-то подобное

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"row"]) {
        myDic = [[myDic alloc] init];
        myDic.isManuf = [attributeDict objectForKey:@"ISMANUF"];
        myDic.isSer = [attributeDict valueForKey:@"ISSER"];
        myDic.Manf = [attributeDict valueForKey:@"MANF"]
        myDic.id = [attributeDict valueForKey:@"ID"]
      }
}

Мой вопрос становится доза, это выглядит правильно? и если да, то как мне объявить этот изменяемый словарь в заголовочном файле? а также как я объявил .isManuf .isSer .Manf .id для этого NSMutableDictionary

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Вы должны различать подкласс NSObject и NSMutableDictionary.

То, как вы это написали, кажется, что это объект с некоторыми атрибутами.Если вы XML rows всегда содержат одни и те же поля, я думаю, что это лучший способ.Атрибуты вашего объекта автоматически изменяются, поэтому с этой стороны не о чем беспокоиться.

Лучше использовать пользовательские объекты, поскольку вероятность ошибок при использовании ключей с ошибками меньше, а код обычно более читабелен.

Итак, вам все еще нужно знать, как объявить ваш объект:

MyDic.h:

@interface MyDic : NSObject {
   BOOL isManuf;
   BOOL isSer;
   NSString *manf;
   NSUInteger id;
}

@property (nonatomic, assign) BOOL isManuf;
@property (nonatomic, assign) BOOL isSer;
@property (nonatomic, retain) NSString *manf;
@property (nonatomic, assign) NSUInteger id;

@end

MyDic.m

@implementation MyDic
@synthetize isManuf, isSer, manf, id;

-(void)dealloc {
   [manf release];
   [super dealloc];
}
@end

не забудьте импортировать пользовательский объект в ваш основной класс и использовать имя класса (с заглавной буквы) при создании объекта.

#import "MyDic.h"
....
myDic = [[MyDic alloc] init];
...
0 голосов
/ 11 октября 2011

Вы не хотите .isManuf, .isSer и т. Д ... в словаре.

Вы можете:

  • создайте классjective-c со свойствами .isManif, isSer (используйте @property и synthesize). Хотя я бы порекомендовал более читаемые имена, а не сокращенные имена - не обязательно должен соответствовать xml.
  • В методе didStartElement выделите init свой пользовательский объект и присвойте свойства.
  • Поскольку вы получаете n из них, вы должны создать NSMutableArray в инициализации этого класса (и определенной в заголовке). Добавьте только что созданный элемент в этот изменяемый массив.
  • Когда вы закончите анализ, у вас будет изменяемый массив всех объектов в xml.
...