0

我正在为两个元素解析 XML 文件:“title”和“noType”。解析完这些后,我将它们添加到一个名为 aMaster 的对象中,这是我自己的包含 NSString 变量的 Master 类的一个实例。

然后,我将这些实例添加到单例的 NSMutableArray 中,以便在程序的其他地方调用它们。问题是当我打电话给他们时,他们似乎不在同一个 NSMutableArray 索引上......每个索引都包含标题或 noType 元素,当它应该是两者时......谁能看到我可能是什么做错了吗?下面是解析器的代码。非常感谢!!

#import "XMLParser.h"
#import "Values.h"
#import "Listing.h"
#import "Master.h"

@implementation XMLParser

@synthesize sharedSingleton, aMaster;

- (XMLParser *) initXMLParser {

    [super init];
    sharedSingleton = [Values sharedValues];
    aMaster = [[Master init] alloc];
    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {

    aMaster = [[Master alloc] init];

        //Extract the attribute here.

    if ([elementName isEqualToString:@"intro"]) {
        aMaster.intro = [attributeDict objectForKey:@"enabled"];
    } else if ([elementName isEqualToString:@"item"]) {
        aMaster.item_type = [attributeDict objectForKey:@"type"];
        //NSLog(@"Did find item with type %@", [attributeDict objectForKey:@"type"]);

        //NSLog(@"Reading id value :%@", aMaster.item_type);
    } else {
        //NSLog(@"No known elements");
    }

    //NSLog(@"Processing Element: %@", elementName);    //HERE
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else {
        [currentElementValue appendString:string];//[tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
        CFStringTrimWhitespace((CFMutableStringRef)currentElementValue);
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"item"]) {
        [sharedSingleton.master addObject:aMaster];
        NSLog(@"Added %@ and %@ to the shared singleton", aMaster.title, aMaster.noType);  //Only having one at a time added... don't know why
        [aMaster release];

        aMaster = nil;

    } else if ([elementName isEqualToString:@"title"]) {
        [aMaster setValue:currentElementValue forKey:@"title"];
    } else if ([elementName isEqualToString:@"noType"]) {
        [aMaster setValue:currentElementValue forKey:@"noType"]; 
        //NSLog(@"%@ should load into the singleton", aMaster.noType);
    }
    NSLog(@"delimiter");
    NSLog(@"%@ should load into the singleton", aMaster.title);
    NSLog(@"%@ should load into the singleton", aMaster.noType);

    [currentElementValue release];
    currentElementValue = nil;

}

- (void) dealloc {
    [aMaster release];
    [currentElementValue release];
    [super dealloc];
}

@end
4

1 回答 1

0

每次didStartElement调用时,您都将设置aMasterMaster该类的新实例。基于 的实现didEndElement,看起来你应该只在item找到新标签时创建一个新实例。这可能是数组中的每个条目都有一个值或另一个值的原因,因为为每个值创建了一个新实例。

于 2009-05-07T18:36:11.017 回答