XMLParser建议
问题描述:
我不知道我在做什么错。我有一个URL导致一个XML树,看起来像:XMLParser建议
<result>
...
<title>
...
</title>
<body>
...
</body>
...
</result>
我只需要解析文件,并获得标题和正文。这里是我的object.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
在我的主代码中,我调用了XML pa RSER这样的:
xmlParser = [[XMLParser alloc] loadXMLbyURL:@"www.websiteWithXML.com"];
但是没有什么是被放入我的arrayOfObjects(我知道这是因为,当我告诉一个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得到多次捕捉到所有的字符在给定的情况元件。
为什么你给你的数组只读属性......?尝试非原子 –
我遵循本教程http://www.theappcodeblog.com/2011/05/09/parsing-xml-in-an-iphone-app-tutorial/ – jisturiz
它的工作很好,但当我试图调整它为我使用...它不工作! – jisturiz