XMLParserbuild议
我不知道我做错了什么。 我有一个通往一个XML树的URL,如下所示:
<result> ... <title> ... </title> <body> ... </body> ... </result>
我只需要parsing文件并获得标题和正文。 这是我的对象.h:
#import <Foundation/Foundation.h> @interface Object : NSObject { NSString *title; NSString *description; } @property (nonatomic, retain) NSString *title; @property (nonatomic, retain) NSString *description; @end
这里是Object.m:
#import "Object.h" @implementation Object @synthesize title, description; -(void) dealloc { [title release]; [description release]; [super dealloc]; } @end
这是我的XMLParser.h:
#import <Foundation/Foundation.h> #import "Object.h" @interface XMLParser : NSObject <NSXMLParserDelegate> { NSMutableString *currentNodeContent; NSMutableArray *arrayOfObjects; NSXMLParser *parser; Object *currentObject; } @property (readonly, retain) NSMutableArray *arrayOfObjects; -(id) loadXMLbyURL:(NSString *)urlString; @end
最后,XMLParser.m:
#import "XMLParser.h" #import "Object.h" @implementation XMLParser @synthesize arrayOfObjects; -(id) loadXMLbyURL:(NSString *)urlString { arrayOfObjects = [[NSMutableArray alloc] init]; NSURL *url = [NSURL URLWithString:urlString]; NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease]; parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; [parser parse]; return self; } -(void) dealloc { [parser release]; [super dealloc]; } -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"result"]) { currentObject = [Object alloc]; } } -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"title"]) { currentObject.title = currentNodeContent; } if([elementName isEqualToString:@"body"]) { currentObject.description = currentNodeContent; } if([elementName isEqualToString:@"result"]) { [arrayOfObjects addObject:currentObject]; [currentObject release]; currentObject = nil; [currentNodeContent release]; currentNodeContent = nil; } } -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } @end
在我的主代码中,我调用了XMLparsing器,如下所示:
xmlParser = [[XMLParser alloc] loadXMLbyURL:@"www.websiteWithXML.com"];
然而,没有什么被放置到我的arrayOfObjects(我知道这是因为当我告诉一个tableview具有与我的数组一样多的行,没有行)。
请帮忙!!! 先谢谢你!
不知道这是否有助于…
尝试改变:
arrayOfObjects = [[NSMutableArray alloc] init];
至:
arrayOfObjects = [[NSMutableArray alloc] initWithCapacity:0];
除此之外,看起来你的代码是好的。 也只是因为你的表没有加载任何东西并不意味着你没有在你的数组中的对象。 在完成parsing之后,在尝试加载tableview之前,使用断点来查看数据。
尝试重置每个元素开始内的currentNodeContent。 例如:
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"result"]) { currentObject = [Object alloc]; } else if ([elementName isEqualToString:@"title"] || [elementName isEqualToString:@"body"]) { [currentNodeContent setString:@""]; } }
然后,当你收到字符做一个追加:
-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { [currentNodeContent appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; }
通过这样做,您可以处理foundCharacters获取多次的情况,以捕获给定元素中的所有字符。