【问题标题】:XMLParser and NSMutableArrayXMLParser 和 NSMutableArray
【发布时间】:2010-11-05 03:34:37
【问题描述】:

我遵循了一个教程,并且 XML 解析部分工作正常。 我的问题是,当打印出我存储到对象中的值(在我的情况下,对象是汽车)时,始终保持为空。我将所有对象保存到一个 NSMutableArray 中,它似乎总是有一个长度/计数 == 0 ...我做错了什么?从代码中可以看出,该数组是在委托类中定义的......

- (XMLParser *) initXMLParser {
    [super init];
    appDelegate = (Car2GoAppDelegate *) [[UIApplication sharedApplication]delegate];
    currentElementValue = [[NSMutableString alloc]init];
    return self;
}


- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attribute:(NSDictionary *)attributeDict {   
    if([elementName isEqualToString:@"kml"]) {
        appDelegate.cars = [[NSMutableArray alloc]init];
    }
    else if([elementName isEqualToString:@"Placemark"]) {
        aCar = [[Car alloc]init];
    }
    else
    return;
}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *) string {
    [currentElementValue appendString:string];

}


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqualToString:@"kml"])
        return;
    if([elementName isEqualToString:@"Style"])
        return;
    if([elementName isEqualToString:@"IconStyle"])
        return;
    if([elementName isEqualToString:@"Icon"])
        return;
    if([elementName isEqualToString:@"color"])
        return;
    if([elementName isEqualToString:@"colorMode"])
        return;
    if([elementName isEqualToString:@"scale"])
        return;
    if([elementName isEqualToString:@"href"])
        return;
    if([elementName isEqualToString:@"styleUrl"])
        return;
    if([elementName isEqualToString:@"a"])
        return;

    if([elementName isEqualToString:@"Placemark"]) {
        [appDelegate.cars addObject:aCar];
        [aCar release];
        aCar = nil;
    }

    else if([elementName isEqualToString:@"name"]) {
        [aCar setValue:currentElementValue forKey:elementName];
    }

    else if([elementName isEqualToString:@"description"]) {
        [aCar setValue:currentElementValue forKey:elementName];
        [currentElementValue setString:@""];
    }
    else if([elementName isEqualToString:@"coordinates"]) {
        [aCar setValue:currentElementValue forKey:elementName];
        [currentElementValue setString:@""];
        NSLog(@"aCar coordinates:%@", [aCar coordinates]);
    }
    else
        return;
}

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

@end

/循环

【问题讨论】:

    标签: iphone nsxmlparser


    【解决方案1】:

    您的代码看起来不错。您确定您的 XML 包含用 Placemark 标签包裹的元素吗??

    您的 xml 中是否还有多个 kml 元素?是否有一个空的导致您的原始数组被丢弃并替换为长度为 0 的新数组?

    【讨论】:

    • 我也觉得这很可疑。每次你得到一个 kml 元素时,你都会把 appDelegate.cars 吹走。我不知道你是否愿意这样做。
    【解决方案2】:

    您不需要使用 initWithCapacity 方法来正确初始化 mutableArray 吗?

    与其直接使用 appDelegate.cars,不如尝试使用本地的 MutableArray,看看有什么不同?

    【讨论】:

    • initWithCapacity 将帮助您节省内存,如果您提前知道有多少项目将存储在数组中。我个人很少使用它,除非我创建不会增长的固定数组。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多