2011-12-08 3 views
1

오늘 URL에서 XML 데이터를 구문 분석하려고합니다. NSXMLParser를 사용하여 XML 데이터를 프로세스에서 처리합니다. 이제 문제는 결과를 기록하려고 할 때 구문 분석 된 항목이 하나 뿐이라는 것입니다. 내가 놓친 어떤 단계가 있습니까?iOS - XML ​​데이터 구문 분석에서 모든 데이터를 가져올 수 없음

내가 원하는 것은이 XML에 대한 모든 항목을 가져 오는 것입니다. 하지만, 왜 단 하나의 항목을 파싱 .. .. ??? 누구든지 나를 도울 수 있니 ..?

xml 데이터.

<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <channel> 
     <generator>Feed Generator</generator> 
     <title>Title</title> 
     <link>http://m.example.com/index.html</link> 
     <description>semua description tentang situs ini</description> 
     <language>id-ID</language> 
     <pubDate>Thu, 08 Dec 2011 18:00:51 +0700</pubDate> 
     <lastBuildDate>Thu, 08 Dec 2011 18:00:51 +0700</lastBuildDate> 
     <webMaster>[email protected] (Editor)</webMaster> 
     <image> 
      <title>Image Title/title> 
      <url>http://imagelink.com/image.jpg</url> 
      <link>http://imagelink.com/imageindex.html</link> 
     </image> 

     <item> 
      <title><![CDATA[Article Title]]></title> 
      <link>http://article-example.com</link> 
      <pubDate>Thu, 08 Dec 2011 17:23:00 +0700</pubDate> 
      <dc:creator>example.com</dc:creator> 
      <category><![CDATA[]]></category> 
      <guid isPermaLink="false">0000380840</guid> 
      <description><![CDATA[article description]]></description> 
      <content:encoded><![CDATA[article content]]></content:encoded> 
      <enclosure url="http://imageurl.com/image.jpg" length="10240" type="image/jpg"/> 
     </item> 

     <item> 
      <title><![CDATA[Article Title]]></title> 
      <link>http://article-example.com</link> 
      <pubDate>Thu, 08 Dec 2011 17:23:00 +0700</pubDate> 
      <dc:creator>example.com</dc:creator> 
      <category><![CDATA[]]></category> 
      <guid isPermaLink="false">0000380840</guid> 
      <description><![CDATA[article description]]></description> 
      <content:encoded><![CDATA[article content]]></content:encoded> 
      <enclosure url="http://imageurl.com/image.jpg" length="10240" type="image/jpg"/> 
     </item> 

     <item> 
      <title><![CDATA[Article Title]]></title> 
      <link>http://article-example.com</link> 
      <pubDate>Thu, 08 Dec 2011 17:23:00 +0700</pubDate> 
      <dc:creator>example.com</dc:creator> 
      <category><![CDATA[]]></category> 
      <guid isPermaLink="false">0000380840</guid> 
      <description><![CDATA[article description]]></description> 
      <content:encoded><![CDATA[article content]]></content:encoded> 
      <enclosure url="http://imageurl.com/image.jpg" length="10240" type="image/jpg"/> 
     </item> 
    </channel> 
</rss> 

여기 내 코드입니다.

file .h 

    NSXMLParser *rssParser; 
    NSMutableArray *articles; 
    NSMutableDictionary *item; 
    NSMutableString *currentElement; 
    NSData *xmlFile; 


    NSMutableString *elementValue, *feedTitle, *feedDate, *feedDesc, *feedID, *feedEnclosure, *feedContent, *feedLink; 

    BOOL errorParsing; 

.

file .m 
/////////XML PARSE///////////// 
- (void)parseXMLFileAtURL:(NSString *)URL{ 
    NSString *agentString = @"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1"; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL]]; 
    [request setValue:agentString forHTTPHeaderField:@"User-Agent"]; 
    xmlFile = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    articles = [[NSMutableArray alloc] init]; 
    errorParsing=NO; 

    rssParser = [[NSXMLParser alloc] initWithData:xmlFile]; 
    [rssParser setDelegate:self]; 

    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:YES]; 

    [rssParser parse]; 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ 
    NSString *errorString = [NSString stringWithFormat:@"Error code %i", [parseError code]]; 
    NSLog(@"Error parsing XML: %@", errorString); 
    NSLog(@"Check your internet connection: %@", errorString); 

    errorParsing=YES; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    elementValue = [elementName copy]; 
    if ([elementName isEqualToString:@"item"]) { 
     item = [[NSMutableDictionary alloc] init]; 
     feedTitle = [[NSMutableString alloc] init]; 
     feedDate = [[NSMutableString alloc] init]; 
     feedContent = [[NSMutableString alloc] init]; 
     feedLink = [[NSMutableString alloc] init]; 
     feedDesc = [[NSMutableString alloc] init]; 
     feedID = [[NSMutableString alloc] init]; 
     feedEnclosure = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    if ([elementValue isEqualToString:@"title"]) { 
     [feedTitle appendString:string]; 
    }else if ([elementValue isEqualToString:@"link"]){ 
     [feedLink appendString:string]; 
    }else if ([elementValue isEqualToString:@"content:encoded"]){ 
     [feedContent appendString:string]; 
    }else if ([elementValue isEqualToString:@"pubDate"]){ 
     [feedDate appendString:string]; 
    }else if ([elementValue isEqualToString:@"guid"]){ 
     [feedID appendString:string]; 
    }else if ([elementValue isEqualToString:@"enclosure"]){ 
     [feedEnclosure appendString:string]; 
    }else if ([elementValue isEqualToString:@"description"]){ 
     [feedDesc appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    if ([elementName isEqualToString:@"item"]) { 

     [item setObject:feedTitle forKey:@"title"]; 
     [item setObject:feedLink forKey:@"link"]; 
     [item setObject:feedDate forKey:@"pubDate"]; 
     [item setObject:feedContent forKey:@"content:encoded"]; 
     [item setObject:feedDesc forKey:@"description"]; 
     [item setObject:feedEnclosure forKey:@"enclosure"]; 
     [item setObject:feedID forKey:@"guid"]; 
     [articles addObject:item]; 
    } 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser{ 
    if (errorParsing == NO) { 

     NSLog(@"ID:%@", feedID); 
     NSLog(@"title:%@", feedTitle); 
     NSLog(@"date created: %@", feedDate); 
     NSLog(@"%@", feedEnclosure); 
     NSLog(@"%@", feedContent); 

     NSLog(@"XML processing done!"); 
    }else{ 
     NSLog(@"error processing xml file"); 
    } 
} 
//////////////////////////////// 

.

결과

2011-12-08 18:51:18.305 FlipView[1537:f803] ID:0000380840 

2011-12-08 18:51:18.306 FlipView[1537:f803] title:Article Title 

2011-12-08 18:51:18.307 FlipView[1537:f803] date created: Mon, 08 Dec 2011 17:23:00 +0700 

2011-12-08 18:51:18.307 FlipView[1537:f803] 



2011-12-08 18:51:18.308 FlipView[1537:f803] article content 

2011-12-08 18:51:18.308 FlipView[1537:f803] XML processing done! 

답변

1

parserDidEndDocument는 구문 분석의 마지막에 한 번만 호출되기 때문입니다. 이 코드는 각 항목의 끝에서 실행하려고합니다.

편집 : 죄송합니다. 이는 암시 된 것 같습니다. 코드를이 코드로 변경하십시오.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    if ([elementName isEqualToString:@"item"]) { 

     [item setObject:feedTitle forKey:@"title"]; 
     [item setObject:feedLink forKey:@"link"]; 
     [item setObject:feedDate forKey:@"pubDate"]; 
     [item setObject:feedContent forKey:@"content:encoded"]; 
     [item setObject:feedDesc forKey:@"description"]; 
     [item setObject:feedEnclosure forKey:@"enclosure"]; 
     [item setObject:feedID forKey:@"guid"]; 
     [articles addObject:item]; 

     NSLog(@"ID:%@", feedID); 
     NSLog(@"title:%@", feedTitle); 
     NSLog(@"date created: %@", feedDate); 
     NSLog(@"%@", feedEnclosure); 
     NSLog(@"%@", feedContent); 

     } 
}  
+0

그래서 나에게 어떤 해결책이 있습니까? – andikurnia

+0

편집 된 댓글보기 –

+0

아, 작동했습니다 ... 리차드에게 감사합니다 ... :) – andikurnia

관련 문제