2009-04-17 4 views
4

Я получаю ответ XML от TwitPic:Перемещение XML из Objective-C

 <?xml version="1.0" encoding="UTF-8"?> 
    <rsp stat="ok"> 
     <mediaid>abc123</mediaid> 
     <mediaurl>http://twitpic.com/abc123</mediaurl> 
    </rsp> 

Я хочу, чтобы получить доступ к значению в тегах "mediaurl.

Так что я пробовал:

NSString *twitpicURL = [[request responseHeaders] objectForKey:@"mediaurl"]; 

Но это не похоже на работу.

Может кто-нибудь указать мне в правильном направлении с этим, пожалуйста?

Thanks,

Jamie.

ответ

3

Яблоко NSXMLDocument (доступно только на Mac OS X) и NSXMLParser (доступно на Mac OS X и iPhone) оба основаны на библиотеке с открытым исходным кодом Libxml2 (доступно на Mac OS X и iPhone).

Если вы решите использовать NSXMLDocument, я бы предложил использовать XPath в качестве быстрого/простого способа получения данных.

0

Я понимаю, что вы попросили пару дней назад, но я подумал, что дам вам пример использования NSXMLParser. Я не помню, откуда я это узнал, но это техника, которую я использовал в своих проектах.

Вы можете создать свой собственный класс, как этот, и создать его после завершения сетевого вызова и вызвать функцию parseData: или просто вставить все это mumbo jumbo в класс, который обрабатывает сетевой код и вызывает функцию оттуда.

#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 
Смежные вопросы