2010-11-18 35 views
2

Chers savants Je suis en train d'analyser un flux RSS avec la structure de l'élément de l'élément suivantAccès aux éléments spécifiques de l'enfant lors de l'analyse RSS avec NSXMLParser

<item> 
     <title>Title</title> 
     <link>http://somelink.com</link> 
     <description>The description</description> 
     <author>[email protected]</author> 
     <guid isPermaLink="false">http://youtube.com/?v=XBE4AX0Iuvw</guid> 
     <pubDate>Thu, 11 Nov 2010 10:56:44 +0000</pubDate> 
     <media:title>Media Title</media:title> 
     <media:thumbnail width="120" url="http://i1.ytimg.com/vi/XBE4AX0Iuvw/default.jpg" height="90"/> 
     <media:category label="Tags"/> 
     <media:player url="http://youtube.com/?v=XBE4AX0Iuvw"/> 
     <media:credit>Credit name</media:credit> 
     <enclosure url="http://youtube.com/v/XBE4AX0Iuvw.swf" duration="104" type="application/x-shockwave-flash"/> 
</item> 

S'il vous plaît noter les tags médias: thumbnail.url dont mon question est liée à.

Code Parser:

// string contants found in the RSS feed 
static NSString *kIDStr  = @"link"; 
static NSString *kNameStr = @"thumbnail"; 
static NSString *kImageStr = @"media:thumbnail"; 
static NSString *kArtistStr = @"description"; 
static NSString *kEntryStr = @"item"; 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
              namespaceURI:(NSString *)namespaceURI 
              qualifiedName:(NSString *)qName 
               attributes:(NSDictionary *)attributeDict 
    { 
     // entry: { id (link), im:name (app name), im:image (variable height) } 
     // 
     NSLog(@"%@",elementName); 
     // I can see all top level elements,even media:thumbnail 

     if ([elementName isEqualToString:kEntryStr]) 
     { 
      self.workingEntry = [[[AppRecord alloc] init] autorelease]; 
     } 
     storingCharacterData = [elementsToParse containsObject:elementName]; 
    } 

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
              namespaceURI:(NSString *)namespaceURI 
             qualifiedName:(NSString *)qName 
    { 
     if (self.workingEntry) 
     { 
      if (storingCharacterData) 
      { 


     NSString *trimmedString = [workingPropertyString stringByTrimmingCharactersInSet: 
              [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

       [workingPropertyString setString:@""]; // clear the string for next time 

       if ([elementName isEqualToString:kIDStr]) 
       { 
        self.workingEntry.appURLString = trimmedString; 
       } 
       else if ([elementName isEqualToString:kNameStr]) 
       {   
        self.workingEntry.appName = trimmedString; 
       } 
       else if ([elementName isEqualToString:kImageStr]) 
       { 

NSLog(@"The Content: %@",workingPropertyString); // Comes back empty, I guess due to the fact it has children inside.    


// QUESTION: How do I get the value stored in media:thumbnail .url 
//NSLog(@">>>>>>>>>>>>> %@/%@",[elementsToParse objectAtIndex:2],workingPropertyString); 



       self.workingEntry.imageURLString = trimmedString; 
       } 
       else if ([elementName isEqualToString:kArtistStr]) 
       { 
        self.workingEntry.artist = trimmedString; 

       } 
      } 
      else if ([elementName isEqualToString:kEntryStr]) 
      { 
       [self.workingArray addObject:self.workingEntry]; 
       self.workingEntry = nil; 
      } 
     } 

    } 

Il semble être une question de syntaxe que je ne suis pas familier avec, qui saisit la valeur stockée dans les médias: thumbnail.url. Quelqu'un peut-il être aussi aimable que de m'aider à le faire?

Répondre

4

Comme url est un attribut de l'élément media:thumbnail, vous devez y accéder via le dictionnaire attributes dans didStartElement:. Le message foundCharacters: (que je suppose est où vous accumulez du texte dans workingPropertyString) est seulement envoyé pour les données de caractères entre les balises de début et de fin d'un élément.

+0

Merci, Cette réponse m'a sur la bonne voie. – chewy

0

Pour obtenir un support: la vignette (ou et toute valeur de l'élément) dans un fichier xml facilement,
utilisation requête XPath. Pour faire xPathQuery vous pouvez utiliser libxml2

Votre requête XPath sonnera comme ça: //media:thumbnail/@url
et vous donnera: http://i1.ytimg.com/vi/XBE4AX0Iuvw/default.jpg

lire ceci: Using libxml2 for XML parsing and XPath queries in Cocoa (suivrez les instructions)

1

Hii amis,

i have similiar issue of retriving image url from MediaThumbnail attr from my feed, 

vous pouvez écrire ceci à didStartElement comme il vérifier les médias: thumnail url à l'intérieur où nous pouvons chercher l'image String url, et cela fonctionne pour moi

if ([elementName isEqualToString:kEntryStr]) 
{ 
    self.workingEntry = [[[AppRecord alloc] init] autorelease]; 
} 
else if([elementName isEqualToString:@"media:thumbnail"]) { 
NSMutableString *currentImgUrl = [[NSMutableString alloc] init]; 
    [currentImgUrl appendString:[attributeDict objectForKey:@"url"]]; 
    NSLog(@"url:%@",currentImgUrl); 
    self.workingEntry.imageURLString = currentImgUrl; 
} 
storingCharacterData = [elementsToParse containsObject:elementName];