NSXMLParser 预期结果一遍又一遍地重复并一次添加 1 个项目

NSXMLParser expected result is repeated over and over and adding 1 item at time

我是 Objective-C 和 XML 的新手,请帮助我解决我的简单问题。

我有这个 XML 文件。XML sample file

我想将解析后的 XML 放入 NSDictionary。问题是结果是这样的result

结果不断重复,每次添加 1 项。

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

if ([elementName isEqualToString:@"CATALOG"]) {
    self.cd = [[NSMutableArray alloc]init];
}
if ([elementName isEqualToString:@"CD"]){
    self.content = [[NSMutableDictionary alloc]init];
}

self.ElementValue = [[NSMutableString alloc] init];

for (id key in attributeDict) {
    NSLog(@"attribute %@", [attributeDict objectForKey:key]);
}

}

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

self.ElementValue = [self.ElementValue stringByAppendingString:string];

}

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

if (![elementName isEqualToString:@"CD"]){
    [self.content setObject:self.ElementValue forKey:elementName];
} else {
    [self.cd addObject:self.content];
}

NSLog(@"%@",self.cd);

}

您的代码似乎是正确的,我猜您对多个 NSLog 输出感到困惑。这是正常的,因为 didEndElement 将为每个元素调用。您应该在 parserDidEndDocument 方法中看到您的最终数组。

请实施 parserDidEndDocument 委托方法并确保您的数组具有正确数量的元素

- (void)parserDidEndDocument:(NSXMLParser *)parser {
  NSLog(@"\n\n\n\n\n");
  NSLog(@"- - - - - - - - - - - - - Parsing Finished - - - - - - - - - - - - - ");
  NSLog(@"%@",self.cd);
}

你的代码也有一点问题更正如下

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

}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
  if ([elementName isEqualToString:@"CD"]) {
    [self.cd addObject:self.content];
  }
  else if (![elementName isEqualToString:@"CATALOG"]) {
    [self.content setObject:self.ElementValue forKey:elementName];
  }
}