所以我不得不解析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或文本。
由于我不擅长正则表达式,因此我暂时坚持这个问题。 这里有没有人遇到过同样的问题,你是怎么解决的?
或者我有一个简单的解决方法吗?
提前致谢!
答案 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完成:@“## __ ##”