Навигация по XML из Objective-C - PullRequest
4 голосов
/ 18 апреля 2009

Я получаю этот XML-ответ от TwitPic:

     <?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"];

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

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

Спасибо

Джейми.

Ответы [ 3 ]

3 голосов
/ 18 апреля 2009

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

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

0 голосов
/ 21 августа 2012

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

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

#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
0 голосов
/ 18 апреля 2009

В CoreFoundation есть библиотека для разбора xml.

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

Если вы не разрабатываете для платформы Apple, Expat является хорошо известным синтаксическим анализатором C XML:)

http://expat.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...