【问题标题】:Navigating XML from Objective-C从 Objective-C 导航 XML
【发布时间】:2009-04-17 23:36:51
【问题描述】:

我从 TwitPic 得到这个 XML 响应:

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

但这似乎不起作用。

有人能指出我正确的方向吗?

谢谢,

杰米。

【问题讨论】:

    标签: objective-c xml


    【解决方案1】:

    Apple 拥有NSXMLDocument(仅适用于 Mac OS X)和NSXMLParser(适用于 Mac OS X 和 iPhone)均基于开源 C 库 Libxml2(适用于 Mac OS X 和 iPhone) .

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

    【讨论】:

      【解决方案2】:

      CoreFoundation 有一个用于解析 xml 的库。

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

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

      http://expat.sourceforge.net/

      【讨论】:

        【解决方案3】:

        我知道你几天前问过这个问题,但我想我会给你一个如何使用 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
        

        【讨论】:

          猜你喜欢
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多