2009-07-08 6 views
11

ich einen RSS-Feed mit NSXMLParser bin Parsen und es funktioniert für den Titel gut und andere Saiten, aber eines der Elemente ist ein Bild, das ist wieMit NSXMLParser mit CDATA

<!CDATA <a href="http:image..etc> 

Wie füge ich das als meine Zellbild in meiner Tabellenansicht? Würde ich das als Bildtyp definieren?

Das ist, was ich mit meinem Parsing zu tun:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    
//NSLog(@"found this element: %@", elementName); 
currentElement = [elementName copy]; 
if ([elementName isEqualToString:@"item"]) { 
    // clear out our story item caches... 
    item = [[NSMutableDictionary alloc] init]; 
    currentTitle = [[NSMutableString alloc] init]; 
    currentDate = [ [NSMutableString alloc] init]; 
    currentSummary = [[NSMutableString alloc] init]; 
    currentLink = [[NSMutableString alloc] init]; 
} 

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  
//NSLog(@"ended element: %@", elementName); 
if ([elementName isEqualToString:@"item"]) { 
    // save values to an item, then store that item into the array... 
    [item setObject:currentTitle forKey:@"title"]; 
    [item setObject:currentLink forKey:@"link"]; 
    [item setObject:currentSummary forKey:@"description"]; 
    [item setObject:currentDate forKey:@"date"]; 

    [stories addObject:[item copy]]; 
    NSLog(@"adding story: %@", currentTitle); 
} 

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
//NSLog(@"found characters: %@", string); 
// save the characters for the current item... 
if ([currentElement isEqualToString:@"title"]) { 
    [currentTitle appendString:string]; 
} else if ([currentElement isEqualToString:@"link"]) { 
    [currentLink appendString:string]; 
} else if ([currentElement isEqualToString:@"description"]) { 
    [currentSummary appendString:string]; 
} else if ([currentElement isEqualToString:@"pubDate"]) { 
    [currentDate appendString:string]; 
} 

}

Antwort

4

Der Punkt ist, dass CDATA alles darin wird nicht als Teil behandelt des XML-Dokuments. Wenn Sie also Tags in CDATA haben, ignoriert der Parser sie.

Ich vermute, dass CDATA im Element Beschreibung ist. Daher müssen Sie die Tags entweder manuell oder über eine andere Instanz eines Parsers aus dem Element "description" extrahieren.

+0

Ja, es eine Bild-URL in die es gibt. Wie kann ich eine Bild-URL mit NSXMLParser extrahieren? – Xcoder

+0

Sehen Sie sich die Zeichenfolge in der CDATA-Sektion an. Wenn es immer gültige XML ist, feuern Sie eine weitere Instanz von NSXMLParser auf * dieser * Zeichenfolge. Wenn es sich nicht um gültiges XML handelt, müssen Sie Something Else ™ ausführen, z. B. das Tag manuell suchen. – Justicle

+0

CMS wie Wordpress haben die Beschreibung in CDATA-Tags. Ein iPhone-Programmierer wird wahrscheinlich aufgefordert, den Beschreibungstext im RSS-Reader-Teil seiner App zu zeigen, genau wie alle RSS-Reader. GabrielNs Antwort ist die Lösung. –

20

können Sie

verwenden
- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock 
{ 
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding]; 
} 
+0

Das funktioniert super. Wenn Sie weiter analysieren müssen, erstellen Sie einfach einen anderen Parser. – Mariano

+0

Dies wird die Antwort für die meisten sein, die danach suchen, um eine Arbeit zu erledigen. Es ist nicht ganz offensichtlich, dass initWithData eine gültige Zeichenfolge aus den gefundenen NSData gibt, aber natürlich, wenn Sie es sehen, gehen Sie "Doh!". :) Arbeitete für mich, +1. –

+0

@Gabriel Bitte sehen Sie meine Frage http://StackOverflow.com/questions/43539307/how-to-post-string-with-special-character-using-xml-parsing-in-objective-c. Wie kann ich deinen Code hören? – Muju