Iphone NSXMLParser不';不要忽略CDATA

Iphone NSXMLParser不';不要忽略CDATA,iphone,ios,xcode,xcode4.5,nsxmlparser,Iphone,Ios,Xcode,Xcode4.5,Nsxmlparser,我是ios开发的新手,我尝试解析RSS文件(xml) 这是xml:(很抱歉使用这种语言) 一般 在一次拖拉机事故中丧生,风帆冲浪者受重伤 < ! [CDATA[ ] ] > 50多岁的拖拉机司机在Kfar Yuval附近翻车并被困在下面。在内塔尼亚,一名风帆冲浪者因强风投掷石块而受重伤,在内塔尼亚,一名风帆冲浪者受轻伤 http://www.ynet.co.il/articles/0 ,7340,L-4360016,00.html 2013年3月22日星期五17:10:15+0200 h

我是ios开发的新手,我尝试解析RSS文件(xml)

这是xml:(很抱歉使用这种语言)


一般
在一次拖拉机事故中丧生,风帆冲浪者受重伤
< ! [CDATA[
] ] > 50多岁的拖拉机司机在Kfar Yuval附近翻车并被困在下面。在内塔尼亚,一名风帆冲浪者因强风投掷石块而受重伤,在内塔尼亚,一名风帆冲浪者受轻伤 http://www.ynet.co.il/articles/0 ,7340,L-4360016,00.html 2013年3月22日星期五17:10:15+0200 http://www.ynet.co.il/articles/0 ,7340,L-4360016,00.html 杀人、车祸、冲浪 这是我的xmlparser代码:

    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
       self.titles = [[NSMutableArray alloc]init];
       self.descriptions = [[NSMutableArray alloc]init];
        self.links = [[NSMutableArray alloc]init];
    }

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"item"]) {
        isItem = YES;
    }

    if ([elementName isEqualToString:@"title"]) {
        isTitle=YES;
        self.titlesString = [[NSMutableString alloc]init];
    }

    if ([elementName isEqualToString:@"description"]) {
        isDesription = YES;
        self.descriptionString = [NSMutableString string];
        self.data = [NSMutableData data];
    }



}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(isItem && isTitle){
        [self.titlesString appendString:string];
    }
    if (isItem && isDesription) {
        if (self.descriptionString)
            [self.descriptionString appendString:string];
    }






}

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{
    if (self.data)
        [self.data appendData:CDATABlock];

}


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"item"]) {
        isItem = NO;
        [self.titles addObject:self.titlesString];

        [self.descriptions addObject:self.descriptionString];


    }

    if ([elementName isEqualToString:@"title"]) {
        isTitle=NO;

    }
    if ([elementName isEqualToString:@"description"]) {

        NSString *result = [self.descriptionString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        NSLog(@"string=%@", result);


        if ([self.data length] > 0)
        {
            NSString *htmlSnippet = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
            NSString *imageSrc = [self firstImgUrlString:htmlSnippet];
            NSLog(@"img src=%@", imageSrc);
            [self.links addObject:imageSrc];
        }



        self.descriptionString = nil;
        self.data = nil;
    }


}

- (NSString *)firstImgUrlString:(NSString *)string
{
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?"
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];

    NSTextCheckingResult *result = [regex firstMatchInString:string
                                                     options:0
                                                       range:NSMakeRange(0, [string length])];

    if (result)
        return [string substringWithRange:[result rangeAtIndex:2]];

    return nil;
}

@end
-(void)parserdistartdocument:(NSXMLParser*)解析器
{
self.titles=[[NSMutableArray alloc]init];
self.descriptions=[[NSMutableArray alloc]init];
self.links=[[NSMutableArray alloc]init];
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict
{
if([elementName IsequalString:@“item”]){
isItem=是;
}
if([elementName IsequalString:@“title”]){
isTitle=是;
self.titleString=[[NSMutableString alloc]init];
}
if([elementName IsequalString:@“description”]){
isDesription=YES;
self.descriptionString=[NSMutableString];
self.data=[NSMutableData];
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串{
如果(isItem&&isTitle){
[self.titleString appendString:string];
}
如果(isItem&&ISDeDescription){
if(自我描述字符串)
[self.descriptionString appendString:string];
}
}
-(void)解析器:(NSXMLParser*)解析器foundCDATA:(NSData*)CDATA块
{
if(自我数据)
[self.data appendData:CDATA块];
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
if([elementName IsequalString:@“item”]){
isItem=否;
[self.titles addObject:self.titleString];
[self.descriptions添加对象:self.descriptionString];
}
if([elementName IsequalString:@“title”]){
isTitle=否;
}
if([elementName IsequalString:@“description”]){
NSString*result=[self.descriptionString-ByTrimmingCharactersInSet:[NSCharacterSet-whitespaceAndNewlineCharacterSet]];
NSLog(@“string=%@”,结果);
如果([self.data length]>0)
{
NSString*htmlSnippet=[[NSString alloc]initWithData:self.data encoding:NSUTF8StringEncoding];
NSString*imageSrc=[self-firstImgUrlString:htmlSnippet];
NSLog(@“img src=%@”,imageSrc);
[self.links addObject:imageSrc];
}
self.descriptionString=nil;
self.data=nil;
}
}
-(NSString*)第一个imgurlstring:(NSString*)字符串
{
n错误*错误=NULL;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“()+?”
选项:nsregularexpressioncase不敏感
错误:&错误];
NSTextCheckingResult*结果=[regex firstMatchInString:字符串
选项:0
范围:NSMakeRange(0,[字符串长度]);
如果(结果)
返回[string substringWithRange:[结果范围索引:2]];
返回零;
}
@结束
就像我说的,我对iPhone开发还很陌生,我花了几个小时寻找解决方法,但什么也没找到。 我决定打开一个话题,然后问几个问题:

One.解析器不会忽略CDATA正在做的事情,而是解析所有内容。 为什么会这样?如您所见,描述本身不在cdata中,我只有第一步,但即使在不使用foundCDATA:(NSData*)cdata块的情况下,我也完成了其余步骤

两个。我想获取图像链接,怎么做?我在网上搜索了很多指南,其中解释了如何只使用foundCDATA:(NSData*)CDATA块函数 但是它是如何使用的呢?我在代码中使用的方式


请给我解释一下,以便我能理解,谢谢回答您的两个问题:

  • 如果您已经实现了
    foundCDATA
    ,解析器将在该方法中解析
    描述
    CDATA,而不是在
    foundCharacters
    中。另一方面,如果尚未实现
    foundCDATA
    ,则
    CDATA
    将由
    foundCharacters
    解析。因此,如果您不希望
    foundCharacters
    解析
    CDATA
    ,那么您必须实现
    foundCDATA

  • 如果你想提取
    img
    URL,你必须解析你收到的HTML。您可以使用Hpple,但我可能倾向于使用正则表达式:

    - (NSString *)firstImgUrlString:(NSString *)string
    {
        NSError *error = NULL;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?"
                                                                               options:NSRegularExpressionCaseInsensitive
                                                                                 error:&error];
    
        NSTextCheckingResult *result = [regex firstMatchInString:string
                                                         options:0
                                                           range:NSMakeRange(0, [string length])];
    
        if (result)
            return [string substringWithRange:[result rangeAtIndex:2]];
    
        return nil;
    }
    

    在回答你的两个问题时:

  • 如果您已经实现了
    foundCDATA
    ,解析器将在该方法中解析
    描述
    CDATA,而不是在
    foundCharacters
    中。另一方面,如果尚未实现
    foundCDATA
    ,则
    CDATA
    将由
    foundCharacters
    解析。因此,如果您不希望
    foundCharacters
    解析
    CDATA
    ,那么您必须实现
    foundCDATA

  • 如果你想提取
    img
    URL,你必须解析你收到的HTML。您可以使用Hpple,但我可能只是倾向于使用常规的
    - (NSString *)firstImgUrlString:(NSString *)string
    {
        NSError *error = NULL;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?"
                                                                               options:NSRegularExpressionCaseInsensitive
                                                                                 error:&error];
    
        NSTextCheckingResult *result = [regex firstMatchInString:string
                                                         options:0
                                                           range:NSMakeRange(0, [string length])];
    
        if (result)
            return [string substringWithRange:[result rangeAtIndex:2]];
    
        return nil;
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"description"])
        {
            self.string = [NSMutableString string];
            self.data = [NSMutableData data];
        }
    }
    
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
        NSLog(@"%s, parseError=%@", __FUNCTION__, parseError);
    }
    
    // In my standard NSXMLParser routine, I leave self.string `nil` when not parsing 
    // a particular element, and initialize it if I am parsing. I do it this way
    // so only my `didStartElement` and `didEndElement` need to worry about the particulars
    // and my `foundCharacters` and `foundCDATA` are simplified. But do it however you
    // want.
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if (self.string)
            [self.string appendString:string];
    }
    
    - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
    {
        if (self.data)
            [self.data appendData:CDATABlock];
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"description"])
        {
            // get the text (non-CDATA) portion
    
            // you might want to get rid of the leading and trailing whitespace
    
            NSString *result = [self.string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            NSLog(@"string=%@", result);
    
            // get the img out of the CDATA
    
            if ([self.data length] > 0)
            {
                NSString *htmlSnippet = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
                NSString *imageSrc = [self firstImgUrlString:htmlSnippet];
                NSLog(@"img src=%@", imageSrc);
            }
    
            // once I've saved the data where I want to save it, I `nil` out my
            // `string` and `data` properties:
    
            self.string = nil;
            self.data = nil;
        }
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {   
        if([currentElement isEqualToString:@"img"]) {
            NSLog(@"%@",[attributeDict objectForKey:@"src"]);
        }
    }
    
        - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
        {
    
        NSMutableString *cdstring = [[NSMutableString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
        }
    
        <div>
        <a href='http://www.ynet.co.il/articles/0,7340,L-4360016,00.html'>
        <img src='http://www.ynet.co. il/PicServer3/2012/11/28/4302844/YOO_8879_a.jpg ' alt=' photo: Yaron Brener ' title=' Amona ' border='0' width='116 ' height='116'>
        </ a>
        </ div>
        ]]>
    
     htmlContent = [NSString stringWithFormat:@"%@", cdstring];
        [webView loadHTMLString:htmlContent baseURL:nil];