更新:我决定更改我的网络服务以输出JSON,更容易使用。我会留下这个开放的,任何人都可以提出一个合理的解决方案,万一它可以帮助他人。
我正在抓取一个XML文件,对其进行解析,并尝试从特定标记中获取内容:
//Grab the hosted XML
NSError *error;
NSURL *mainContentURL = [NSURL URLWithString:@"http://www.andrewlarking.co.uk/DigiCons/appContent.xml"];
NSString *mainPageContents = [NSString stringWithContentsOfURL:mainContentURL encoding:NSUTF8StringEncoding error:&error];
NSData *mainPageData = [mainPageContents dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"mainPageData returned = %@", [[NSString alloc] initWithData:mainPageData encoding:NSUTF8StringEncoding]);
//Parse the XML
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:mainPageData];
[parser setDelegate:self];
[parser parse];
}
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"In parser");
if([elementName isEqualToString:@"feb5Content"])
{
NSLog(@"In elementname");
NSLog(@"valueforkey title = %@", [attributeDict valueForKey:@"page.title"]);
self.dcViewControllerLabel.text = [attributeDict valueForKey:@"page.title"];
}
}
一切都很好,但key @“page.title”或@“title”的值返回null。这是XML:
<feb5Content>
<page>
<title>I am a test title.</title>
<subTitle>I am the subtitle.</subTitle>
</page>
</feb5Content>
有什么想法吗?
理想情况下,我希望能够获取元素中存在的各种元素的内容。所以我可以拥有标题,subTitle,bodyText,我需要抓住它们。应用程序的每个页面都将其内容存储在元素中。
干杯。
答案 0 :(得分:1)
那是因为您的页面标题不是<feb5Content>
元素的属性。它是<title>
元素的值。所以你必须听取<title>
元素的开头:
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
self.isTitleElement = [elementName isEqualToString:@"title"];
}
然后在下面的方法中获取<title>
元素中的值:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (self.isTitleElement) {
NSLog(@"valueforkey title = %@", string);
// store value so that it is not overwritten by the next title
[self.pageTitles addObject:string];
}
}
每次在XML元素中找到文本时都会调用此方法。因此,在调用此方法时,您必须检查是否在<title>
元素内。这就是我加入ivar self.isTitleElement
的原因。
要存储页面标题,您可以将它们放入NSMutableArray ivar中。