Доступ к определенным дочерним элементам при разборе RSS с NSXMLParser - PullRequest
2 голосов
/ 18 ноября 2010

Уважаемые учёные! Я пытаюсь проанализировать ленту RSS со следующей структурой элемента item

<item> 
         <title>Title</title> 
         <link>http://somelink.com</link> 
         <description>The description</description> 
         <author>rss@youtube.com</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> 

Обратите внимание на тег media: thumbnail.url , с которым связан мой вопрос.

Код парсера:

// 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;
            }
        }

    }

Кажется, это синтаксис, с которым я не знаком, который захватывает значение, хранящееся в media: thumbnail.url.Может ли кто-то быть добрым, чтобы помочь мне в этом?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

Поскольку url является атрибутом элемента media:thumbnail, вам необходимо получить к нему доступ через словарь attributes в didStartElement:.Сообщение foundCharacters: (которое, как я предполагаю, - это место, где вы накапливаете текст в workingPropertyString), отправляется только для символьных данных между начальным и конечным тегами элемента.

1 голос
/ 24 ноября 2010

Hii Friends,

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

вы можете написать это в didStartElement, так как он проверяет медиа: thumnail внутри url, где мы можем получить строку URL-адреса изображения, и это работает для меня

  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];
0 голосов
/ 18 ноября 2010

Чтобы легко получить мультимедиа: миниатюру (или и любое значение элемента) в XML-файле,
используйте запрос xpath . Чтобы сделать XPathQuery, вы можете использовать libxml2

Ваш XPath Query будет звучать так: //media:thumbnail/@url
и даст вам: http://i1.ytimg.com/vi/XBE4AX0Iuvw/default.jpg

прочитайте это: Использование libxml2 для разбора XML и запросов XPath в Какао (следуйте инструкциям)

...