从Objective-C导航XML

从Objective-C导航XML,objective-c,xml,Objective C,Xml,我从TwitPic得到了以下XML响应: <?xml version="1.0" encoding="UTF-8"?> <rsp stat="ok"> <mediaid>abc123</mediaid> <mediaurl>http://twitpic.com/abc123</mediaurl> </rsp> 但这似乎不起作用 有人能用这个给我指一下正确

我从TwitPic得到了以下XML响应:

     <?xml version="1.0" encoding="UTF-8"?>
    <rsp stat="ok">
        <mediaid>abc123</mediaid>
        <mediaurl>http://twitpic.com/abc123</mediaurl>
    </rsp>
但这似乎不起作用

有人能用这个给我指一下正确的方向吗

谢谢


Jamie.

CoreFoundation有一个用于解析xml的库

如果您不是为苹果平台开发,expat是一个众所周知的C XML解析器:)

苹果(仅适用于Mac OS X)和(适用于Mac OS X和iPhone)都基于开源C库(适用于Mac OS X和iPhone)


如果您决定使用NSXMLDocument,我建议您使用它作为获取数据的快速/简单方法

我知道你几天前问过这个问题,但我想我会给你一个如何使用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
#导入“ThaweeExampleParser.h”
@接口ThaweeExampleParser()
@属性(非原子)BOOL累加ParsedCharacterData;
@属性(非原子,强)NSMutableString*currentParsedCharacterData;
@属性(非原子,强)NSMutableDictionary*解析内容;
@结束
@WeeExampleParser的实现
@综合积累解析的字符数据;
@综合当前解析的字符数据;
@综合分析内容;
/*
*此函数在网络连接完成时调用。
*传入在请求过程中收集的NSMutableData。
*/
-(void)parseData:(NSData*)webData
{
self.currentParsedCharacterData=[NSMutableString];
self.parsedContents=[NSMutableDictionary];
NSXMLParser*parser=[[NSXMLParser alloc]initWithData:webData];
parser.delegate=self;
[语法分析器解析];
}
/*
*解析后的函数每次找到新标记时都会调用此函数。
*标记看起来像“”
*因此,在本例中,我们希望将或BOOL设置为YES,以便最后一个函数只收集我们关心的字符。
*/
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict
{
if([elementName IsequalString:@“mediaurl”])
{
self.contractingParsedCharacterData=是;
[self.currentParsedCharacterData集合字符串:@”“;
}
}
/* 
*除标记外,上一个函数的外观类似“”
*把我们的BOOL改为NO,因为我们现在已经收集完了角色。
*我们还将重要数据保存到字典中,以便您以后使用。
*/
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
if([elementName IsequalString:@“mediaurl”])
{
self.contractingParsedCharacterData=否;
[self.parsedContents setObject:[self.currentParsedCharacterData copy]forKey:elementName];
}
}
/*
*解析器每次找到字符时都调用此函数。
*在您的情况下,它可能会调用它5或6次您不想收集的数据。
*所以我们用BOOL来控制我们收集的东西;
*/
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串
{
if(self.contractingParsedCharacterData)[self.currentParsedCharacterData appendString:string];
}
@结束
#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