xml - 从 NSXMLDocument 获取值

标签 xml cocoa nsarray

我正在使用 API 上传图像,我需要从如下所示的 XML 输出中获取上传的图像 URL (image_link)

<?xml version="1.0" encoding="iso-8859-1"?><imginfo xmlns="http://ns.imageshack.us/imginfo/7/" version="7" timestamp="1283286280">
  <rating>
    <ratings>0</ratings>
    <avg>0.0</avg>
  </rating>
  <files server="834" bucket="1378">
     <image size="515455" content-type="image/jpeg">maidsamaep20scr1.jpg</image>
     <thumb size="8822" content-type="image/jpeg">maidsamaep20scr1.th.jpg</thumb>
  </files>
  <resolution>
    <width>1280</width>
    <height>720</height>
  </resolution>
  <class>r</class>
  <visibility>no</visibility>
  <uploader>
    <ip>69.125.188.189</ip>
  </uploader>
  <links>
    <image_link>http://img834.imageshack.us/img834/1378/maidsamaep20scr1.jpg</image_link>
    <image_html>&lt;a href=&quot;http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://img834.imageshack.us/img834/1378/maidsamaep20scr1.jpg&quot; alt=&quot;Free Image Hosting at www.ImageShack.us&quot; border=&quot;0&quot;/&gt;&lt;/a&gt;</image_html>
    <image_bb>[URL=http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg][IMG]http://img834.imageshack.us/img834/1378/maidsamaep20scr1.jpg[/IMG][/URL]</image_bb>
    <image_bb2>[url=http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg][img=http://img834.imageshack.us/img834/1378/maidsamaep20scr1.jpg][/url]</image_bb2>
    <thumb_link>http://img834.imageshack.us/img834/1378/maidsamaep20scr1.th.jpg</thumb_link>
    <thumb_html>&lt;a href=&quot;http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://img834.imageshack.us/img834/1378/maidsamaep20scr1.th.jpg&quot; alt=&quot;Free Image Hosting at www.ImageShack.us&quot; border=&quot;0&quot;/&gt;&lt;/a&gt;</thumb_html>
    <thumb_bb>[URL=http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg][IMG]http://img834.imageshack.us/img834/1378/maidsamaep20scr1.th.jpg[/IMG][/URL]</thumb_bb>
    <thumb_bb2>[url=http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg][img=http://img834.imageshack.us/img834/1378/maidsamaep20scr1.th.jpg][/url]</thumb_bb2>
    <yfrog_link>http://yfrog.com/n6maidsamaep20scr1j</yfrog_link>
    <yfrog_thumb>http://yfrog.com/n6maidsamaep20scr1j.th.jpg</yfrog_thumb>
    <ad_link>http://img834.imageshack.us/my.php?image=maidsamaep20scr1.jpg</ad_link>
    <done_page>http://img834.imageshack.us/content.php?page=done&amp;l=img834/1378/maidsamaep20scr1.jpg</done_page>
  </links>

这就是我目前拥有的。我获取了要上传的文件,并从 NSXMLDocument 的响应中获取了数据。唯一的问题是从 NSXMLDocument 获取 image_link。

-(void)openPanelDidEnd:(NSOpenPanel *)openPanel
            returnCode:(int)returnCode
           contextInfo:(void *)x
{
    // Did they chosose "Open"
    if (returnCode == NSOKButton) {
            // Start Upload
        NSLog(@"%@",[openPanel filename]);
        //Set Imageshack Upload API URL
        NSURL *url = [NSURL URLWithString:@"http://www.imageshack.us/upload_api.php"];
        ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
        //Set API Key
        [request setPostValue:@"" forKey:@"key"];
        //Set File
        [request setFile:[openPanel filename] forKey:@"fileupload"];
        //Set Progress
        [request setDownloadProgressDelegate:APIProgress];
        [request startSynchronous];
        // Show API Output
        NSString *response = [request responseString];
        NSLog(@"%@",response);
        int httpcode = [request responseStatusCode];
        if (httpcode == 200) {
                    // Perform XML Phasing 
            NSError * error;
            NSArray *itemNodes;
                    // Convert Response Data from NSString to NSData
            NSData *data = [response dataUsingEncoding:NSUTF8StringEncoding];
            NSXMLDocument *doc = [[NSXMLDocument alloc] initWithData:data 
                                                             options:0 
                                                               error:&error];
            NSMutableArray* imglinks = [[NSMutableArray alloc] initWithCapacity:13];
            NSLog(@"%@", doc);
                    // XPath to get image_link value only
            itemNodes = [doc nodesForXPath:@"//links/image_link" error:&error];
            for(NSXMLElement* xmlElement in itemNodes)
                [imglinks addObject:[xmlElement stringValue]];
            NSLog(@"%@",[[imglinks objectAtIndex:0]stringValue]);
                    // Insert Image URL to Message
            [fieldmessage setString:[NSString stringWithFormat:@"#image %@ \\n\\n %@",[[imglinks objectAtIndex:0]stringValue],[fieldmessage string]]];
                    // Release unneeded items from memory
            [itemNodes release];
            [doc release];
            [data release];
        }
        else {
            // Upload Failed, show error message
            [self showsheetmessage:@"MelScrobbleX was unable to upload the image you selected" explaination:[NSString stringWithFormat:@"Error: i \\n \\n %@", httpcode, response]];
        }
    }
}

问题是它似乎没有显示 NSMutableArray 中的字符串值。它给了我这个错误:

2010-08-31 16:22:13.496 MelScrobbleX[45835:a0f] -[NSCFString stringValue]: unrecognized selector sent to instance 0x12ada80
2010-08-31 16:22:14.026 MelScrobbleX[45835:a0f] -[NSCFString stringValue]: unrecognized selector sent to instance 0x12ada80

从 NSMutableArray 检索 image_link 值的正确方法是什么?

最佳答案

在这一行

 for(NSXMLElement* xmlElement in itemNodes)
            [imglinks addObject:[xmlElement stringValue]];

在将 xmlElement 放入数组 imglinks 之前,您已获取了 xmlElementstringValue。所以,在这一行

 NSLog(@"%@",[[imglinks objectAtIndex:0]stringValue]);

stringValue 是不必要的...你不应该要求字符串给出字符串值,它已经是一个字符串了!就这么做

 NSLog(@"%@",[imglinks objectAtIndex:0]);

关于xml - 从 NSXMLDocument 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3613005/

相关文章:

objective-c - 如何根据对象的属性对数组进行排序?

objective-c - 来自 NSSet 的 NSArray 元素未显示在 TableViewCell 中

ios - NSArray 上超出范围和无效摘要错误

c++ - 在混合图形芯片的低功耗端使用 OpenGL

c++ - 从 Xerces 获取 XML 数据 (c++)

css - 编辑 .svg 以制作动画 - XML

xml - XSLT:如何复制父节点不变并转换子节点

javascript - 数据绑定(bind)在 XML View 中不起作用

cocoa - NSBezierPath/线相交/展平

macos - NSArrayController 更改其选择 : what is the best way to catch this event?