CDATA块中的文本+图像

时间:2013-02-14 10:38:03

标签: objective-c image parsing text cdata

所以我不得不解析CDATA块中的数据。

看起来像

<![CDATA[Important text I need<span style=" color:#000000;"><img src="imageName.jpg" alt="imageName" border=0 style="vertical-align:text-bottom;" /></span>Still important text]]>

<![CDATA[Important text I need]]>

<![CDATA[imageName.jpg]]>

或类似的东西。

结果应该是一个数组,在第一个例子的cas中,数组的内容将是 “我需要的重要文字”, “imageName.jpg” “仍然重要的文字”

另一个的结果是一个数组,其中一个对象包含imageName或文本。

由于我不擅长正则表达式,因此我暂时坚持这个问题。 这里有没有人遇到过同样的问题,你是怎么解决的?

或者我有一个简单的解决方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果您使用的是NSXMLParser,则会有一个名为foundCDATA的委托方法,如下所示:

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
    if (!parseElement) {
        return;
    }
    if (parsedElementData==nil) {
        parsedElementData = [[NSMutableData alloc] init];
    }
    [parsedElementData appendData:CDATABlock];

    //Grabs the whole content in CDATABlock.
    NSMutableString *content = [[NSMutableString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];

 }

现在将this prewritten class添加到您的项目中。然后将其导入要在其中使用的解析器类:

#import NSString_stripHTML

现在,您可以将以下行添加到foundCDATA方法:

NSString *strippedContent;
strippedContent = [content strippedHtml];

现在您将删除没有任何额外字符的剥离文本。你可以从这个剥离的文本中对你想要的任何内容进行子串。

答案 1 :(得分:0)

所以我来找我自己的解决方案: 第一种方法在cdataString中搜索任何HTML。 如果cdataString包含任何HTML,我搜索“src = ...”的行为。

- (NSString *)stringByStrippingHTML:(NSString *)htmlString {
    NSRange r;
    while ((r = [htmlString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound){
        // substring from htmlString starting with "<" and ends with ">"
        NSString *substring     = [htmlString substringWithRange:r];

        //new Image String, stays empty if no image is found
        NSString *imageString   = @"";

        //length >= 9 because shortest possible result can be length nine, i.e. "src=1.png"
        if (substring.length >= 9) {

            //substring contains String "src=" ?
            NSRange imageRange      = [substring rangeOfString:@"src=[^>]+" options:NSRegularExpressionSearch];
            if (imageRange.location != NSNotFound) {

                //find the image name
                imageString  = [self imageFromHTMLString:substring];
            }
            //set the image string the imagename + my seperator tag
            imageString = [NSString stringWithFormat:@"##__##%@##__##",imageString];
        }
        //replace html stuff with either emty string or my imagename
        htmlString = [htmlString stringByReplacingCharactersInRange:r withString:imageString];

    }
    return htmlString;
}
- (NSString *)imageFromHTMLString:(NSString *)htmlString{
    NSRange range;

    NSString *result = @"";
    while ((range = [htmlString rangeOfString:@"src=[^>]+ " options:NSRegularExpressionSearch]).location != NSNotFound) {

        htmlString  = [[[htmlString substringWithRange:range] componentsSeparatedByString:@" "] objectAtIndex:0];
        result      = [htmlString stringByReplacingOccurrencesOfString:@"src=" withString:@""];
    }

    return result;

}

方法用于:

myCdataString = [self stringByStrippingHTML:myCdataString];

返回值是一个格式为:

的字符串
Important Text I need##__##ImageName.png##__##More ImportantText I need

创建数组可以通过componentsSeparatedByString完成:@“## __ ##”