2009-04-17 6 views
4

J'obtiens cette réponse XML de TwitPic:Navigation XML à partir Objective-C

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

Je veux accéder à la valeur dans les balises les 'mediaurl'.

donc j'ai essayé:

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

Mais cela ne semble pas fonctionner.

Quelqu'un peut-il me diriger dans la bonne direction avec ceci s'il vous plaît?

Merci,

Jamie. CoreFoundation dispose d'une bibliothèque pour l'analyse de xml.

Répondre

3

Apple a NSXMLDocument (disponible sur Mac OS X uniquement) et NSXMLParser (disponible sur Mac OS X et iPhone) sont basés sur la bibliothèque C open source Libxml2 (disponible sur Mac OS X et iPhone).

Si vous décidez d'utiliser NSXMLDocument, je suggère d'utiliser XPath comme moyen simple et rapide d'obtenir les données.

0

Je me rends compte que vous avez posé cette question il y a quelques jours, mais j'ai pensé vous donner un exemple d'utilisation de NSXMLParser. Je ne me souviens pas d'où j'ai appris cela, mais c'est la technique que j'ai utilisée pour mes projets. Vous pouvez soit créer votre propre classe comme celle-ci et l'instancier après la fin de votre appel réseau et appeler la fonction "parseData:", ou simplement coller tout ce mumbo jumbo dans la classe qui gère le code réseau et appeler la fonction De là.

#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 
Questions connexes