4 Stimmen

XML von Objective-C aus navigieren

Ich erhalte diese XML-Antwort von TwitPic:

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

Ich möchte auf den Wert innerhalb der "mediaurl"-Tags zugreifen.

Also habe ich es versucht:

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

Aber das scheint nicht zu funktionieren.

Kann mir bitte jemand den richtigen Weg weisen?

Danke,

Jamie.

3voto

Nathan Kinsinger Punkte 21743

Apple hat NSXMLDocument (nur unter Mac OS X verfügbar) und NSXMLParser (verfügbar für Mac OS X und iPhone) basieren beide auf der Open-Source-C-Bibliothek Libxml2 (verfügbar für Mac OS X und iPhone).

Wenn Sie sich für die Verwendung von NSXMLDocument entscheiden, würde ich vorschlagen, dass Sie XPath als eine schnelle/einfache Möglichkeit, die Daten zu erhalten.

0voto

Nippysaurus Punkte 19810

CoreFoundation verfügt über eine Bibliothek zum Parsen von Xml.

http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFXML/CFXML.html

wenn Sie nicht für die Apple-Plattform entwickeln, ist expat ein bekannter C-XML-Parser :)

http://expat.sourceforge.net/

0voto

Thawe Punkte 171

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X