Синтаксический анализатор DOM делает вещи намного проще для таких вещей, но это означает (а) выбор библиотеки, которая поддерживает DOM на iOS, выяснение того, как она работает, ее особенности и т. Д. И (б) наличие всего документа XMLв памяти, прежде чем разобрать его и заполнить модель таблицы.Во многих случаях это не имеет большого значения, но иногда проблемы с памятью могут вынудить вас отказаться от DOM.
Если вы хотите избежать этих потенциальных проблем для своего приложения, не так сложно реализовать то, что выхочу использовать NSXMLParser.Для начала определите класс, который представляет «Поездку», и присвойте этому классу нужные свойства для каждой поездки (начало, конец, прибытие и т. Д.).Затем в своем классе делегата синтаксического анализатора определите несколько иваров для хранения изменяемого массива объектов Trip, объекта «currentTrip», который можно заполнять по ходу работы, и буфера изменяемых символов, который можно использовать для захвата символов, отсканированных синтаксическим анализатором.
Имея их, вы можете реализовать что-то вроде следующего в вашей логике делегата синтаксического анализатора:
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"Document started", nil);
allTrips = [[NSMutableArray alloc] init];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict {
if([elementName hasPrefix:@"trip"]) {
NSLog(@"Found trip: %@ !", elementName);
currentTrip = [[Trip alloc] initWithName:elementName];
}
else {
characterBuffer = [[NSMutableString alloc] init];
}
NSLog(@"Processing Element: %@", elementName);
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSLog(@"Processing Value: %@", string);
[characterBuffer appendString:string];
}
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
if([elementName hasPrefix:@"trip"]) {
[allTrips addObject:currentTrip];
}
else if ([elementName isEqualToString:@"start"){
// Set start value
NSString *value = [characterBuffer stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[currentTrip setStart:value];
}
// Handle each other trip property you care about with separate else if's
}
Это просто базовая структура кода, которую вы хотите, не обязательно оптимизировать.В частности, я не включил никаких выпусков, чтобы избежать утечек памяти, которые вам понадобятся, если вы не используете ARC.Кроме того, я создал новый объект characterBuffer в начале каждого элемента, который может включать в себя текст, который вам небезразличен: это может быть сделано более разумно, с небольшим вниманием и вниманием.Вы понимаете, хотя.
В целом, этот подход может быть немного утомительным, но он также не сложен, и в некоторых случаях он может работать немного лучше, чем анализ DOM, если это то, чтофактор для вашего приложения.