使用nsxmlparserdelegate提供阅读器

时间:2012-11-11 12:11:48

标签: objective-c ios rss xml-parsing nsxmlparser

我正在创建一个应用程序,显示来自特定Web服务的最新提要,我正在使用NSXMLParserDelegate协议用于此目的,我读了苹果文档,我也尝试了一些教程,但某些地方似乎出了问题,我不明白didEndElement,foundCharacters如何工作,反正我想显示图片,标题和内容,帖子的发布日期,我是xmlparsing的新手这里是我的 viewcontroller.h (我刚刚仅解析以下代码中的title元素)

   @property(nonatomic,strong)NSString *currentElement;
   @property(nonatomic,strong)NSString *currentTitle;
   @property(nonatomic,strong)NSMutableArray *titles;

viewdidload

NSURL *url=[NSURL URLWithString:@"http://www.forbes.com/fast/feed"];
NSXMLParser *parser=[[NSXMLParser alloc]initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
NSLog(@"%d",titles.count);

didStartElement

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
 {

self.currentElement=elementName;

if ([self.currentElement isEqualToString:@"title"]) 
{

    self.currentTitle=[NSMutableString alloc];
    titles=[[NSMutableArray alloc]init];

    titles=[attributeDict objectForKey:@"title"];
}
 }

foundCharacters

 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
 {

self.currentElement=elementName;

if ([self.currentElement isEqualToString:@"title"]) 
{

    self.currentTitle=[NSMutableString alloc];
    titles=[[NSMutableArray alloc]init];

    titles=[attributeDict objectForKey:@"title"];
}
  }

didEndElement

 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([self.currentElement isEqualToString:@"title"])
{
    NSLog(@"%@",self.currentTitle);


}
}

怀疑

1)我应该在哪里声明我的titles数组,以便我可以添加单个标题对象。 didStartElement中[attributeDict objectForKey]的用途是什么?它为我的程序返回null

2)foundCharacters委托实际上做了什么?它附加了什么?

3)在didEndElement之后为什么编译器不能访问didStartElement而不是foundCharacters?

4)最后我应该实际使用NSXMLParserDelegate协议进行xml解析,其他像touchXML,TBXML和raywenderlich中提供的其他协议有什么不同?

我很抱歉这篇长篇文章,但我没有在网上得到任何令人满意的答案我的查询,我使用了所有的断点,并弄清楚如何来回调用代表,我需要一些有启发性的答案我的查询,谢谢抱歉

2 个答案:

答案 0 :(得分:0)

1. 在开始解析之前声明你的数组。每当你遇到一个元素(一个xml标签)时,初始化元素(在类中设置一些BOOL,你可以识别出什么元素你正在读);

2. 找到的字符是作为标记值找到的字符。如果您知道要读取的是哪个元素(读取实例变量),则应将此字符串附加到临时NSMutableString并添加它只在元素结束时才到数组。

3。因为在到达新标记之前它没有开始寻找其他字符。

示例

我看到你很困惑,让我们说你有这个XML代码:

<person> mickey mouse </person>

当你遇到标签元素开始,然后你找到其他字符(不是整个字符串,只是字符串的一部分),直到字符串结束,然后当你遇到标签时元素结束。

答案 1 :(得分:0)

在didFindCharacters中只是将找到的字符添加到NSMutableString中,并且在didEndElement中你知道你结束了什么并将变量设置为你找到的字符串

图像: image =&gt; didEnd中的字符是链接的名称,url位于didStart

中的属性中

标题标签 didStart =&gt; didStart:html开始,每个标签都是html,直到标题标签的didEnd

内容: didStart =&gt; didStart:html开始,每个标签都是html,直到内容的didEnd