使用NSXMLParser解析XML并获取特定的属性值

时间:2013-12-03 16:27:22

标签: ios xml xml-parsing nsxmlparser

更新:我决定更改我的网络服务以输出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,我需要抓住它们。应用程序的每个页面都将其内容存储在元素中。

干杯。

1 个答案:

答案 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中。