将xml解析为NSMutableDictionary

时间:2011-10-10 22:08:44

标签: iphone ios nsxmlparser nsmutabledictionary

我目前正在尝试将一些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);

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"]
      }
}

我的问题看起来似乎正确吗?然后,如果是这样,我如何在头文件中声明这个可变字典?以及如何为此NSMutableDictionary声明.isManuf .isSer .Manf .id

2 个答案:

答案 0 :(得分:1)

您必须区分NSObjectNSMutableDictionary的子类。

你写它的方式,它看起来是一个具有一些属性的对象。如果你的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];
...

答案 1 :(得分:0)

你不想在字典上使用.isManuf,.isSer等...

你可以:

  • 使用.isManif创建一个objective-c类,isSer属性(使用@property和synthesize)。虽然,我建议使用更易读的名称而不是缩写名称 - 不需要匹配xml。
  • 在didStartElement方法中,为您的自定义对象分配init并分配属性。
  • 由于你找回了它们,你应该在该类的init中创建一个NSMutableArray(并在头文件中定义)。将刚刚创建的项添加到该可变数组中。
  • 完成解析后,您将拥有xml中所有对象的可变数组。