2010-08-31 4 views
0

J'utilise une API pour télécharger une image et je dois obtenir l'URL de l'image téléchargée (image_link) de la sortie XML ci-dessousObtenir une valeur de NSXMLDocument

<?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> 

C'est ce que J'ai actuellement. J'ai obtenu le fichier à télécharger et j'ai pris les données de la réponse à un NSXMLDocument. Le seul problème consiste à obtenir le lien image_link à partir de NSXMLDocument.

-(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]]; 
     } 
    } 
} 

Le problème est qu'il ne semble pas afficher la valeur de chaîne à partir de NSMutableArray. Il me donne cette erreur:

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 

Quelle est la manière correcte de récupérer la valeur image_link de NSMutableArray?

+0

Si vous lisez le message d'erreur, il vous dit que vous avez envoyé le message 'stringValue' à un objet NSString (bien, NSCFString, mais c'est un détail de mise en œuvre), et cet objet ne répond pas aux ce message. Comme le dit Yuji, cela a du sens parce que c'est une chaîne, donc vous avez déjà sa valeur de chaîne. –

Répondre

2

Dans cette ligne

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

Vous avez déjà pris stringValue du xmlElement avant de le mettre dans le tableau imglinks. Ainsi, dans cette ligne

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

stringValue est inutile ... vous ne devez pas demander une chaîne pour donner une valeur de chaîne, il est déjà une chaîne! Il suffit de faire

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

Il a supprimé cette erreur, mais ne rapporte toujours pas image_link. Il me donne une erreur hors limites pour l'index 0 de 0 – chikorita157

+0

chikorita: C'est parce que le tableau est vide (aucun objet dedans-le second 0). Vous n'avez reçu aucun élément 'image_link' sur cette exécution. Soit les données ont changé, soit vous avez changé le code d'une autre manière et ainsi rompu l'extraction des valeurs de chaîne des éléments 'image_link'. –

+0

Mon mauvais ... J'ai foiré le XPath en essayant de faire fonctionner le truc. Depuis que je suis revenu à ce que j'ai posté et ça marche. – chikorita157

Questions connexes