使用NSXMLParserparsing复杂的XML结构

我有这个相当复杂的XML从我的服务器返回,我想一些帮助parsing成一个对象,我可以为以后使用。

这是xml的样子

<Eng> <Result > <Series > <Link/> <FMF/> <AlsoLink/> <Plugins/> </FMF> <Sheet > <Spaces> <Spacing > <Names/> </Spacing> <Spacing > <Names/> </Spacing> </Spaces> </Sheet> </Series> </Result> </Eng> 

然后,我使用NSXMLParser尝试parsingxml中每个元素的所有“ObjectForKey / s”到他们自己的dictionarys ..如果这是有道理的。

这是我的代码目前看起来像

 #pragma mark - Parsing lifecycle - (void)startTheParsingProcess:(NSData *)parserData { NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process [parser setDelegate:self]; [parser parse]; // starts the event-driven parsing operation. } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"Series"]){ parsedMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict]; self.parsedDataArrayOfDictionaries = [NSMutableArray arrayWithCapacity:8]; if ([elementName isEqualToString:@"Link"]) { } if ([elementName isEqualToString:@"FMF"]) { if ([elementName isEqualToString:@"AlsoLink"]) { } else if ([elementName isEqualToString:@"Plugins"]) { } } else if ([elementName isEqualToString:@"Sheet"]) { if ([elementName isEqualToString:@"Spaces"]) { if ([elementName isEqualToString:@"Spacing"]) { if ([elementName isEqualToString:@"Names"]) { } } } } } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"Series"]){ [parsedDataArrayOfDictionaries addObject:parsedMutableDictionary]; if ([elementName isEqualToString:@"Link"]) { } if ([elementName isEqualToString:@"FMF"]) { if ([elementName isEqualToString:@"AlsoLink"]) { } else if ([elementName isEqualToString:@"Plugins"]) { } } else if ([elementName isEqualToString:@"Sheet"]) { if ([elementName isEqualToString:@"Spaces"]) { if ([elementName isEqualToString:@"Spacing"]) { if ([elementName isEqualToString:@"Names"]) { } } } } } // parsedMutableDictionary = nil; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"Paser Error = %@", parseError); UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A parsing failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [errorAlert show]; } //TODO: Look into how to use this method over multiple views. ie(other requests such as keycode, advanced ) - (void)parserDidEndDocument:(NSXMLParser *)parser { // display values NSArray *filteredArray = parsedDataArrayOfDictionaries; NSLog(@"%@", filteredArray); } 

我遇到的问题是,我不明白我应该在自己的对象…还有一些这些值返回时,我可以有多个间距元素,我只是不知道如何处理… …

任何帮助或提示将非常感激,如果我没有指定的东西只是问,因为我的大脑只是努力围绕这个问题。

谢谢。

假设你的XML文件….

 <Series element1="something" element2="something"> <Spaces> <Spacing> <Names> Something </Names> </Spacing> <Spacing> <Names>Something</Names> </Spacing> </Spaces> </Series> 

为了得到element1的价值,你必须做…

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([currentElement isEqualToString:@"Series"]) { NSLog(@"%@",[attributeDict objectForKey:@"element1"]); } } 

要获得间距的多个值,您必须执行….

 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if([currentElement isEqualToString:@"name"]) { [currentSpacingName appendString:string]; [currentSpacingName appendString:@"any character"] } } 

之后,将该值存储到具有期望键的字典中。

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

这只是一个例子,我希望现在你可以解决你的问题。

您正在使用NSXMLParser ….因此您将获得标签… <tag>strings</tag>之间的<tag>strings</tag>

要获得多个间距元素,你可以在NSString对象中附加所有的string。