Успение 1. Вас интересуют только данные в элементе p (paragraph) и что вы используете NSXMLParser.
Успение 2. Вы хотите сохранить любой элемент внутри p неповрежденным.
Стратегия, которую вы хотите использовать, заключается в создании конечного автомата для вашего синтаксического анализатора, чтобы он знал, когда ему нужно сохранять данные и когда игнорировать данные по мере их получения.
Настройте свой NSXMLParser delegate
, используя образец кода от Apple. Ваш делегат будет нуждаться в ivar BOOL inParagraph
для отслеживания, когда данные будут сохранены или отброшены. Начальным значением inParagaph
является NO
. Когда делегат получает parser:didStartElement:namespaceURI:qualifiedName:attributes:
сообщения, if ([element isEqual:@"p"])
очистить ваши receivedData
переменных и установить inParagraph = YES
EDIT: 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:
сообщение, он проверяет, является ли он в элементе «р», 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
user290796: Потому что вы пытались использовать встроенный шрифт кода, где вам нужно было использовать блок кода. См. Http://daringfireball.net/projects/markdown/syntax. –