假設1.您只對p(段落)元素中的數據感興趣,並且您正在使用NSXMLParser。
假設2.你想保持p中的任何元素完好無損。
要使用的策略是爲分析器創建一個狀態機,以便它知道何時需要保存數據以及何時忽略接收到的數據。
使用Apple的示例代碼設置您的NSXMLParser delegate
。 您的代表需要一個ivar BOOL inParagraph
用於跟蹤何時保留或丟棄數據。 inParagaph
的初始值爲NO
。 當您的委託接收parser:didStartElement:namespaceURI:qualifiedName:attributes:
消息,if ([element isEqual:@"p"])
清楚您receivedData
變量和設定inParagraph = YES
編輯:receivedData是一個的NSMutableString。修正了代碼示例
此時您的parser delegate
想要保存收到的數據。
當parser delegate
收到parser:foundCharacters:
消息時,如示例代碼中所示,將字符串追加到receivedData
。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (inParagraph) [receivedData appendString:string];
}
當解析器遇到內聯元素時,委託將再次收到parser:didStartElement:namespaceURI:qualifiedName:attributes:
。這是在inParagraph
狀態變量很重要時。解析器將不會收到元素的封閉'<'和'>'字符,因此您必須將elementName
包含在'<'和'>'字符中並添加到receivedData
。像
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{ if (inParagraph)
{
NSString *inlineElementName = [NSString stringWithFormat:@"<%@>", elementName];
[receivedData appendString:inlineElementName];
}
....
}
當parser delegate
接收parser:didEndElement:namespaceURI:qualifiedName:
消息的東西,它會檢查是否是在「P」的元素,if (inParagraph && ![elementName isEqual:@"p"]
,關閉內嵌元素。 if ([elementName isEqual:@"p"])
將receivedData
的內容添加到持有段落的NSMutableArray
中。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (inParagraph)
{
if (![elementName isEqual:@"p"])
{
NSString *inlineElementName = [NSString stringWithFormat:@"</%@>", elementName];
[receivedData appendString:inlineElementName];
} else { // received closing </p> tag add receivedData to the paragraph array
[paragraphsArray addObject:[receivedData copy]];
[self setInParagraph:NO];
}
}
}
}
道歉的格式,我試圖編輯,但由於某種原因,我得到一個錯誤。 – JWood 2010-04-16 15:24:41
user290796:因爲您試圖在需要使用代碼塊的地方使用內聯代碼字體。請參閱http://daringfireball.net/projects/markdown/syntax。 – 2010-04-16 18:20:40