Ich weiß, dass Sie diese Frage schon vor ein paar Tagen gestellt haben, aber ich dachte, ich würde Ihnen ein Beispiel für die Verwendung von NSXMLParser geben. Ich weiß nicht mehr, woher ich das gelernt habe, aber das ist die Technik, die ich in meinen Projekten verwendet habe.
Sie können entweder eine eigene Klasse wie diese erstellen und sie nach Beendigung des Netzwerkaufrufs instanziieren und die Funktion "parseData:" aufrufen, oder Sie können diesen ganzen Hokuspokus einfach in die Klasse einfügen, die den Netzwerkcode verarbeitet, und die Funktion von dort aus aufrufen.
#import "ThaweExampleParser.h"
@interface ThaweExampleParser() <NSXMLParserDelegate>
@property (nonatomic) BOOL accumulatingParsedCharacterData;
@property (nonatomic, strong) NSMutableString *currentParsedCharacterData;
@property (nonatomic, strong) NSMutableDictionary *parsedContents;
@end
@implementation ThaweExampleParser
@synthesize accumulatingParsedCharacterData;
@synthesize currentParsedCharacterData;
@synthesize parsedContents;
/*
* This function you would call when your network connection finishes.
* You pass in the NSMutableData you collected during the request.
*/
- (void)parseData:(NSData *)webData
{
self.currentParsedCharacterData = [NSMutableString string];
self.parsedContents = [NSMutableDictionary dictionary];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:webData];
parser.delegate = self;
[parser parse];
}
/*
* The parsed calls this function everytime it finds a new tag.
* A tag looks like "<mediaurl>"
* So in this case we want to turn or BOOL to YES so that the last function collects only the characters we care about.
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"mediaurl"])
{
self.accumulatingParsedCharacterData = YES;
[self.currentParsedCharacterData setString:@""];
}
}
/*
* Much the previous function except the tag looks like "</mediaurl>"
* Turn our BOOL to NO because we are done collecting characters for the moment.
* We also are saving the important data to a dictionary so that you can use it later.
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"mediaurl"])
{
self.accumulatingParsedCharacterData = NO;
[self.parsedContents setObject:[self.currentParsedCharacterData copy] forKey:elementName];
}
}
/*
* The parser calls this function everytime it finds characters.
* In your case it would call it maybe 5 or 6 times with data that you dont want to collect.
* So we use a BOOL to control what we collect;
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (self.accumulatingParsedCharacterData) [self.currentParsedCharacterData appendString:string];
}
@end