将具有相同名称的重复元素解析到NSArray中?

问题描述:

所有元素都存储在NSStrings中,除了存储在NSArray中的Dog。我想要将所有的狗条目添加到NSArray中。现在只有一个狗值被添加到数组中。我如何将所有的狗值添加到NSArray?将具有相同名称的重复元素解析到NSArray中?

<root> 
     <element> 
       <person>Jim<person/> 
       <age>21<age/> 
       <dog>Labrador<dog/> 
       <dog>Beagle<dog/> 
       <dog>Yorkshire Terrier<dog/> 
     <element/> 
     <element> 
       <person>Jill<person/> 
       <age>50<age/> 
       <dog>Boxer<dog/> 
       <dog>Pug<dog/> 
       <dog>Labrador<dog/> 
       <dog>Beagle<dog/> 
       <dog>Yorkshire Terrier<dog/> 
     <element/> 
    </root> 


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

     if([elementName isEqualToString:@"root"]) { 
      //Initialize the array. 
      appDelegate.entries = [[NSMutableArray alloc] init]; 
     } 
     else if([elementName isEqualToString:@"element"]) { 

      //Initialize the entry. 
      anEntry = [[Entry alloc] init]; 

      //Extract the attribute here. 
      anEntry.entryID = [[attributeDict objectForKey:@"id"] integerValue]; 

      NSLog(@"Reading id value :%i", anEntry.entryID); 
     } 

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

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

     if(!currentElementValue) 
      currentElementValue = [[NSMutableString alloc] initWithString:string]; 
     else 
      [currentElementValue appendString:string]; 

     NSLog(@"Processing Value: %@", currentElementValue); 

    } 

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

     if([elementName isEqualToString:@"root"]) 
      return; 


     if([elementName isEqualToString:@"element"]) { 
      [appDelegate.entries addObject:anEntry]; 

      anEntry = nil; 
     } 
     else 
      [anEntry setValue:currentElementValue forKey:elementName]; 

     currentElementValue = nil; 
    } 

原因是关键狗有多个值。
所以,如果你说:

[anEntry setValue:currentElementValue forKey:elementName]; 

然后是关键(的ElementName)可能已经包含value.You使用公解析器,你已经明白它是如何工作的,唯一的事情是,你必须考虑所有标签,不仅元素和root.In如果-then.else,还必须考虑的情况下,该标签是狗:

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

    if([elementName isEqualToString:@"root"]) 
     return; 


    if([elementName isEqualToString:@"element"]) { 
     [appDelegate.entries addObject:anEntry]; 

     anEntry = nil; 
    } 
    else if([elementName isEqualToString: @"dog"]) 
    { 
     [anEntry.dogs addObject: currentElementValue]; 
    } 
    else 
     [anEntry setValue:currentElementValue forKey:elementName]; 

    currentElementValue = nil; 
} 

这种情况下,您的入门级应该有一个名为狗属性,它是一个的NSMutableArray ,可读。