我正在使用以下代码来解析xml文件。但它只返回xml文件的第一个条目。我似乎无法找到问题的原因。我认为它确实首先返回所有条目,但是当我再次运行我的应用程序时,只显示了三个条目。另一次尝试,只有第一次出现。现在我每次都得到第一个条目。
更新我发现错误是由于我的xml中的HTML实体造成的。但是现在我在解析文件时解码了这些。 UTF-8编码的字符显示在我的字符串中,如é显示为é
THPRSSParser.h
#import <Foundation/Foundation.h>
#import "NSString+HTML.h"
@interface THPRSSFeedParser : NSObject <NSXMLParserDelegate>
- (NSMutableArray *)getNews;
@end
THPRSSParser.m
#import "THPRSSFeedParser.h"
@implementation THPRSSFeedParser {
NSXMLParser *parser;
NSMutableArray *feed;
NSMutableDictionary *item;
NSMutableString *guid;
NSMutableString *title;
NSMutableString *content;
NSMutableString *description;
NSMutableString *url;
NSMutableString *pubdate;
NSString *element;
}
- (NSMutableArray *)getNews {
feed = [[NSMutableArray alloc] init];
NSURL *feedurl = [NSURL URLWithString:@"http://www.rembrandt-college.nl/rss.php"];
NSData *feedData = [[NSData alloc] initWithContentsOfURL:feedurl];
NSString *result = [[NSString alloc] initWithData:feedData encoding:NSISOLatin1StringEncoding];
result = [result stringByDecodingHTMLEntities];
feedData = [result dataUsingEncoding:NSUTF8StringEncoding];
parser = [[NSXMLParser alloc] initWithData:feedData];
[parser setDelegate:self];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
return feed;
}
//NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
element = elementName;
if ([element isEqualToString:@"item"]) {
item = [[NSMutableDictionary alloc] init];
guid = [[NSMutableString alloc] init];
title = [[NSMutableString alloc] init];
content = [[NSMutableString alloc] init];
description = [[NSMutableString alloc] init];
url = [[NSMutableString alloc] init];
pubdate = [[NSMutableString alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
[item setObject:guid forKey:@"guid"];
[item setObject:title forKey:@"title"];
[item setObject:content forKey:@"content:encoded"];
[item setObject:description forKey:@"description"];
[item setObject:url forKey:@"link"];
[item setObject:pubdate forKey:@"pubDate"];
[feed addObject:[item copy]];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([element isEqualToString:@"guid"]) {
[guid appendString:string];
} else if ([element isEqualToString:@"title"]) {
[title appendString:string];
} else if ([element isEqualToString:@"content:encoded"]) {
[content appendString:string];
} else if ([element isEqualToString:@"description"]) {
[description appendString:string];
} else if ([element isEqualToString:@"link"]) {
[url appendString:string];
} else if ([element isEqualToString:@"pubDate"]) {
[pubdate appendString:string];
}
}
@end
XML
<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Rembrandt College Veenendaal nieuws</title>
<link>http://rembrandt-college.nl/nieuws</link>
<description></description>
<pubDate>Wed, 01 Oct 2014 12:17:40 +0100</pubDate>
<item>
<title>Nieuws van 1 mei</title>
<link>http://rembrandt-college.nl/nieuws/1/Nieuws+van+1+mei</link>
<description>Korte beschrijving nieuws 1 mei</description>
<guid isPermaLink="false">1</guid>
<pubDate>Thu, 01 May 2014 00:00:00 +0100</pubDate>
<content:encoded>Lange beschrijving nieuws 1 mei
Met een extra regel hier!
En hier!</content:encoded>
</item>
<item>
<title>Nieuws van 10 juni</title>
<link>http://rembrandt-college.nl/nieuws/2/Nieuws+van+10+juni</link>
<description>Korte beschrijving
voor het nieuws
van 10 juni</description>
<guid isPermaLink="false">2</guid>
<pubDate>Tue, 10 Jun 2014 00:00:00 +0100</pubDate>
<content:encoded>Voor de leerlingen van groep 8 is het laatste jaar op de basisschool een belangrijk jaar. Nog één jaar op de basisschool, een jaar om te laten zien wat ze in hun mars hebben. Een jaar waarin de keuze voor een vervolgschool moet worden gemaakt. Een spannend en enerverend jaar voor kinderen van 11 – 12 jaar en ook voor hun ouders.
Leerlingen uit groep 8 willen zich een beeld vormen van de “middelbare school”. Daarom organiseren wij een oriëntatie op het Voortgezet Onderwijs speciaal voor deze leerlingen.
Het doel van de inloopmiddag is om leerlingen, samen met de klasgenoten en de eigen docent, in het echt kennis te laten maken met het Voortgezet Onderwijs, kennis te laten maken met nieuwe vakken en de sfeer van de “middelbare” school te proeven. En niet te vergeten, om vragen te stellen.</content:encoded>
</item>
<item>
<title>Plaatjes voor het nieuws werken nu ook</title>
<link>http://rembrandt-college.nl/nieuws/4/Plaatjes+voor+het+nieuws+werken+nu+ook</link>
<description>Plaatjes... plaatjes everywhere!</description>
<guid isPermaLink="false">4</guid>
<pubDate>Wed, 02 Jul 2014 00:00:00 +0100</pubDate>
<content:encoded>Ze zijn te vinden op:
http://www.rembrandt-college.nl/_db/news/_thumb/4.jpg
Auto-resize staat op 200x200
en
http://www.rembrandt-college.nl/_db/news/4.jpg
Auto-resize staat op 400x400</content:encoded>
</item>
<item>
<title>Brugklas kamp</title>
<link>http://rembrandt-college.nl/nieuws/3/Brugklas+kamp</link>
<description>Korte beschrijving nieuws 1 augustus met bacon ipsum tekst.</description>
<guid isPermaLink="false">3</guid>
<pubDate>Fri, 01 Aug 2014 00:00:00 +0100</pubDate>
<content:encoded>Natuurlijk is het even schrikken als je vers van de basisschool bij ons op het Rembrandt terecht komt. Je zult wel moeten wennen. Meteen in het begin van het schooljaar gaan de brugklassen een aantal dagen op kamp. Dit doen we vooral, omdat je elkaar dan snel goed leert kennen. Een paar dagen met elkaar op stap dat helpt je snel aan de nieuwe situatie wennen. Na een paar dagen van dans, sport en natuurlijk ook ontspanning is het Rembrandt College helemaal jouw school. De foto's van het brugklaskamp kunt je terug vinden in het fotoboek.</content:encoded>
</item>
<item>
<title>Rembrandt en talent</title>
<link>http://rembrandt-college.nl/nieuws/5/Rembrandt+en+talent</link>
<description></description>
<guid isPermaLink="false">5</guid>
<pubDate>Wed, 17 Sep 2014 00:00:00 +0100</pubDate>
<content:encoded>Het Rembrandt college had een aantal brilliante natuurkundigen op bezoek.</content:encoded>
</item>
<item>
<title>Nieuws van 29 september</title>
<link>http://rembrandt-college.nl/nieuws/6/Nieuws+van+29+september</link>
<description></description>
<guid isPermaLink="false">6</guid>
<pubDate>Tue, 30 Sep 2014 00:00:00 +0100</pubDate>
<content:encoded>In 2007 hadden we de geweldige klassieker Romeo en Julia op onze school. Vele uren oefenen, veel werk en veel plezier leverden een prachtige voorstelling op waar ouders, broers en zussen, neven en nichten en vrienden en vriendinnen hebben genoten van vakwerk op het podium.
Het plezier en de kwaliteit spatten van het podium. Een echte Rembrandt voorstelling onder de bezielende leiding van Mette Spruit. In het fotoboek krijg je een goede indruk van deze voorstelling. Er is ook een prachtig fotoboek verschenen.
</content:encoded>
</item>
</channel>
</rss>
解码HTML实体后xml:
<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Rembrandt College Veenendaal nieuws</title>
<link>http://www.rembrandt-college.nl/nieuws</link>
<description></description>
<pubDate>Wed, 01 Oct 2014 14:19:30 +0100</pubDate>
<item>
<title>Nieuws van 1 mei</title>
<link>http://www.rembrandt-college.nl/nieuws/1/Nieuws+van+1+mei</link>
<description>Korte beschrijving nieuws 1 mei</description>
<guid isPermaLink="false">1</guid>
<pubDate>Thu, 01 May 2014 00:00:00 +0100</pubDate>
<content:encoded>Lange beschrijving nieuws 1 mei
Met een extra regel hier!
En hier!</content:encoded>
</item>
<item>
<title>Nieuws van 10 juni</title>
<link>http://www.rembrandt-college.nl/nieuws/2/Nieuws+van+10+juni</link>
<description>Korte beschrijving
voor het nieuws
van 10 juni</description>
<guid isPermaLink="false">2</guid>
<pubDate>Tue, 10 Jun 2014 00:00:00 +0100</pubDate>
<content:encoded>Voor de leerlingen van groep 8 is het laatste jaar op de basisschool een belangrijk jaar. Nog één jaar op de basisschool, een jaar om te laten zien wat ze in hun mars hebben. Een jaar waarin de keuze voor een vervolgschool moet worden gemaakt. Een spannend en enerverend jaar voor kinderen van 11 – 12 jaar en ook voor hun ouders.
Leerlingen uit groep 8 willen zich een beeld vormen van de “middelbare school”. Daarom organiseren wij een oriëntatie op het Voortgezet Onderwijs speciaal voor deze leerlingen.
Het doel van de inloopmiddag is om leerlingen, samen met de klasgenoten en de eigen docent, in het echt kennis te laten maken met het Voortgezet Onderwijs, kennis te laten maken met nieuwe vakken en de sfeer van de “middelbare” school te proeven. En niet te vergeten, om vragen te stellen.</content:encoded>
</item>
<item>
<title>Plaatjes voor het nieuws werken nu ook</title>
<link>http://www.rembrandt-college.nl/nieuws/4/Plaatjes+voor+het+nieuws+werken+nu+ook</link>
<description>Plaatjes... plaatjes everywhere!</description>
<guid isPermaLink="false">4</guid>
<pubDate>Wed, 02 Jul 2014 00:00:00 +0100</pubDate>
<content:encoded>Ze zijn te vinden op:
http://www.rembrandt-college.nl/_db/news/_thumb/4.jpg
Auto-resize staat op 200x200
en
http://www.rembrandt-college.nl/_db/news/4.jpg
Auto-resize staat op 400x400</content:encoded>
</item>
<item>
<title>Brugklas kamp</title>
<link>http://www.rembrandt-college.nl/nieuws/3/Brugklas+kamp</link>
<description>Korte beschrijving nieuws 1 augustus met bacon ipsum tekst.</description>
<guid isPermaLink="false">3</guid>
<pubDate>Fri, 01 Aug 2014 00:00:00 +0100</pubDate>
<content:encoded>Natuurlijk is het even schrikken als je vers van de basisschool bij ons op het Rembrandt terecht komt. Je zult wel moeten wennen. Meteen in het begin van het schooljaar gaan de brugklassen een aantal dagen op kamp. Dit doen we vooral, omdat je elkaar dan snel goed leert kennen. Een paar dagen met elkaar op stap dat helpt je snel aan de nieuwe situatie wennen. Na een paar dagen van dans, sport en natuurlijk ook ontspanning is het Rembrandt College helemaal jouw school. De foto's van het brugklaskamp kunt je terug vinden in het fotoboek.</content:encoded>
</item>
<item>
<title>Rembrandt en talent</title>
<link>http://www.rembrandt-college.nl/nieuws/5/Rembrandt+en+talent</link>
<description></description>
<guid isPermaLink="false">5</guid>
<pubDate>Wed, 17 Sep 2014 00:00:00 +0100</pubDate>
<content:encoded>Het Rembrandt college had een aantal brilliante natuurkundigen op bezoek.</content:encoded>
</item>
<item>
<title>Nieuws van 29 september</title>
<link>http://www.rembrandt-college.nl/nieuws/6/Nieuws+van+29+september</link>
<description></description>
<guid isPermaLink="false">6</guid>
<pubDate>Tue, 30 Sep 2014 00:00:00 +0100</pubDate>
<content:encoded>In 2007 hadden we de geweldige klassieker Romeo en Julia op onze school. Vele uren oefenen, veel werk en veel plezier leverden een prachtige voorstelling op waar ouders, broers en zussen, neven en nichten en vrienden en vriendinnen hebben genoten van vakwerk op het podium.
Het plezier en de kwaliteit spatten van het podium. Een echte Rembrandt voorstelling onder de bezielende leiding van Mette Spruit. In het fotoboek krijg je een goede indruk van deze voorstelling. Er is ook een prachtig fotoboek verschenen.
</content:encoded>
</item>
</channel>
</rss>