Предположение 1. Вас интересуют только данные в элементе p (абзаце) и то, что вы используете NSXMLParser.
Предположение 2. Вы хотите сохранить любой элемент внутри p без изменений.
Стратегия, которую вы хотите использовать, состоит в том, чтобы создать конечный автомат для вашего анализатора, чтобы он знал, когда ему нужно сохранять данные, а когда игнорировать данные по мере их получения.
Настройте NSXMLParser delegate
, используя образец кода от Apple.
Вашему делегату понадобится ивар BOOL inParagraph
для отслеживания того, когда данные будут сохранены или отброшены. Начальное значение inParagaph
составляет NO
.
Когда ваш делегат получит сообщение parser:didStartElement:namespaceURI:qualifiedName:attributes:
, if ([element isEqual:@"p"])
очистите переменную receivedData
и установите inParagraph = YES
РЕДАКТИРОВАТЬ: ReceiveData является 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];
}
}
}
}