在iOS中parsing具有相同名称但在不同字段中的属性

我有一个PHP如下:

<?php header("Content-Type: application/rss+xml; charset=ISO-8859-1"); $ip=$_GET['ip']; $type=$_GET['type']; $rssfeed = '<?xml version="1.0" encoding="ISO-8859-1"?>'; $rssfeed .= '<rss version="2.0">'; $connection = mysql_connect('localhost','root') or die('Could not connect to database'); mysql_select_db('Android') or die ('Could not select database'); $query = "SELECT * FROM User_Upload_Table WHERE Status='Approved' and Content_Type='$type' ORDER BY Approved_Time desc"; $result = mysql_query($query) or die ("Could not execute query"); while($row = mysql_fetch_array($result)) { extract($row); $rssfeed .= "<channel>"; $rssfeed .= "<title>" .$row[Content_Name] ."</title>"; $rssfeed .= '<link>http://'.$ip .$row[Content_Path] .$row[Status] . '/' .$row[Content_Name] . '</link>'; if($type == "Video"){ $rssfeed .= '<description>' .$row[Duration]. '</description>'; } $rssfeed .= '<category>' .$row[Description]. '</category>'; $rssfeed .= '<rating>' .$row[Rating]. '</rating>'; $rssfeed .= '<generator>' .$row[Vote_Count]. '</generator>'; $rssfeed .= '<language></language>'; if($type == "Video"){ $name = $row[Content_Name]; $subName = substr($name, 0, strpos($name, '.')); $rssfeed .= '<image>http://'.$ip.'/Android/'.$type.'/'.$subName.'.jpg</image>'; } else { $rssfeed .= '<image>http://'.$ip.'/Android/'.$type.'/Approved.jpg</image>'; } $rssfeed .= '<copyright>Copyright 2011</copyright>'; $rssfeed .= '<item>'; $rssfeed .= '<title>Pre-Roll</title>'; $rssfeed .= '<link>http://'.$ip.'/Android/Video/Approved/MERCEDES_BENZ.3gp</link>'; $rssfeed .= '<description>Post-Roll</description>'; $rssfeed .= '<source>http://'.$ip.'/Android/Video/Approved/PG_Dawn_PGDN4582000_30.mp4</source>'; $rssfeed .= '</item>'; $rssfeed .= '</channel>'; } $rssfeed .= '</rss>'; echo $rssfeed; ?> 

在这里,我有两个字段名称标题,一个在通道,另一个在项目属性。 我怎样才能分开parsing。 我的parsing代码如下:

  -(void)parseXMLFileAtURL:(NSString *)URL{ NSURL *xmlURL = [NSURL URLWithString:URL]; rssParser = [[NSXMLParser alloc]initWithContentsOfURL:xmlURL]; [rssParser setDelegate:self]; [rssParser setShouldProcessNamespaces:NO]; [rssParser setShouldReportNamespacePrefixes:NO]; [rssParser setShouldResolveExternalEntities:NO]; [rssParser parse]; NSLog(@"Parsed"); } -(void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"Found file and started parsing"); } -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSString *errorString = [NSString stringWithFormat:@"Unable to download feed from website (Error Code %i)", [parseError code]]; NSLog(@"Error parsing xml: %@", errorString); UIAlertView *errorAlert = [[UIAlertView alloc]initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ insideItem = FALSE; insideChannel = FALSE; rssElement = [[NSMutableDictionary alloc]init]; currentElement = [elementName copy]; if ([elementName isEqualToString:@"channel"]) { title = [[NSMutableString alloc]init]; link = [[NSMutableString alloc]init]; description = [[NSMutableString alloc]init]; copyright = [[NSMutableString alloc]init]; image = [[NSMutableString alloc]init]; } } -(void)parser: (NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"channel"]) { [rssElement setObject:title forKey:@"title"]; [rssElement setObject:link forKey:@"link"]; [rssElement setObject:description forKey:@"description"]; [rssElement setObject:copyright forKey:@"copyright"]; [rssElement setObject:image forKey:@"image"]; [item addObject:[rssElement copy]]; NSLog(@"adding stories %@", title); } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if ([currentElement isEqualToString:@"title"]) { [title appendString:string]; }else if ([currentElement isEqualToString:@"link"]) { [link appendString:string]; }else if ([currentElement isEqualToString:@"description"]) { [description appendString:string]; }else if ([currentElement isEqualToString:@"copyright"]) { [copyright appendString:string]; }else if ([currentElement isEqualToString:@"image"]) { [image appendString:string]; } } -(void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"all done"); NSLog(@"item array has %d items", [item count]); [tableView reloadData]; NSLog(@"Finished Parsing"); } 

现在,问题是当我在表视图中显示饲料,两个标题字段正在追加,但我只需要显示通道属性的标题字段。

请帮助我,让我知道我做错了什么。

正确的代码在这方面将会有巨大的帮助。

在didStartElement中,将当前标签推送到堆栈。 在didEndElement中,从堆栈中popup它。 然后,您可以随时检查父元素的堆栈,并区分频道的标题元素和项目的标题元素。

我已经解决了这个问题。 我目前的代码解决了我的问题如下:

 -(void)parseXMLFileAtURL:(NSString *)URL{ NSURL *xmlURL = [NSURL URLWithString:URL]; rssParser = [[NSXMLParser alloc]initWithContentsOfURL:xmlURL]; [rssParser setDelegate:self]; [rssParser setShouldProcessNamespaces:YES]; [rssParser setShouldReportNamespacePrefixes:NO]; [rssParser setShouldResolveExternalEntities:NO]; [rssParser setIsAccessibilityElement:YES]; [rssParser parse]; } -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSString *errorString = [NSString stringWithFormat:@"Unable to download feed from website (Error Code %i)", [parseError code]]; UIAlertView *errorAlert = [[UIAlertView alloc]initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ currentElement = [elementName copy]; if ([elementName isEqualToString:@"channel"]) { channelDictionary = [[NSMutableDictionary alloc]init]; itemAttributeArray = [[NSMutableArray alloc]init]; insideItem = FALSE; }else { if ([elementName isEqualToString:@"item"]) { insideItem = TRUE; itemDictionary = [[NSMutableDictionary alloc]init]; } } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ key = [[NSMutableString alloc]init]; key = [currentElement copy]; value = [[NSMutableString alloc]init]; [value setString:string]; if (insideItem == TRUE) { [itemDictionary setObject:value forKey:currentElement]; }else{ [channelDictionary setObject:value forKey:currentElement]; } } -(void)parser: (NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"channel"]) { [channelDictionary setObject:itemAttributeArray forKey:@"item"]; [channelAttributeArray addObject:[channelDictionary copy]]; }else { if ([elementName isEqualToString:@"item"]){ [itemAttributeArray addObject:[itemDictionary copy]]; insideItem = FALSE; } } } -(void)parserDidEndDocument:(NSXMLParser *)parser{ [tableView reloadData]; }