Как использовать NSXMLParser для синтаксического анализа элементов parent-child с одинаковым именем

Кто-нибудь знает, как разбирать следующий xml, используя class NSXMLParser, управляемый событиями?

  Main    Child 1     Child 2    

Я хочу собрать все три имени из этого xml-файла, возможно ли это, или мне нужно изменить синтаксический анализ на основе дерева?

Это обычная проблема с такими синтаксическими анализаторами, как «тип SAX», где вам нужно вручную отслеживать текущую глубину дерева XML, в котором вы находитесь. Проблема, как всегда, заключается в том, что загрузка всего дерева в структура DOM в памяти может быть невозможна, в зависимости от размера данных, которые вы хотите манипулировать.

В следующем коде показан class, выполняющий эту работу:

 #import  @interface Test : NSObject  { @private NSXMLParser *xmlParser; NSInteger depth; NSMutableString *currentName; NSString *currentElement; } - (void)start; @end 

Это реализация:

 #import "Test.h" @interface Test () - (void)showCurrentDepth; @end @implementation Test - (void)dealloc { [currentElement release]; [currentName release]; [xmlParser release]; [super dealloc]; } - (void)start { NSString *xml = @"MainChild 1Child 2"; xmlParser = [[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]]; [xmlParser setDelegate:self]; [xmlParser setShouldProcessNamespaces:NO]; [xmlParser setShouldReportNamespacePrefixes:NO]; [xmlParser setShouldResolveExternalEntities:NO]; [xmlParser parse]; } #pragma mark - #pragma mark NSXMLParserDelegate methods - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"Document started", nil); depth = 0; currentElement = nil; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"Error: %@", [parseError localizedDescription]); } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { [currentElement release]; currentElement = [elementName copy]; if ([currentElement isEqualToString:@"Node"]) { ++depth; [self showCurrentDepth]; } else if ([currentElement isEqualToString:@"name"]) { [currentName release]; currentName = [[NSMutableString alloc] init]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"Node"]) { --depth; [self showCurrentDepth]; } else if ([elementName isEqualToString:@"name"]) { if (depth == 1) { NSLog(@"Outer name tag: %@", currentName); } else { NSLog(@"Inner name tag: %@", currentName); } } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if ([currentElement isEqualToString:@"name"]) { [currentName appendString:string]; } } - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"Document finished", nil); } #pragma mark - #pragma mark Private methods - (void)showCurrentDepth { NSLog(@"Current depth: %d", depth); } @end 

Это результат запуска инструмента командной строки, который запускает метод «start» выше:

 Document started Current depth: 1 Outer name tag: Main Current depth: 2 Inner name tag: Child 1 Current depth: 1 Current depth: 2 Inner name tag: Child 2 Current depth: 1 Current depth: 0 Document finished 
 - (NSInteger)columnNumber 

дает вам уровень вложенности NSXMLParser

Очень простой способ решить эту проблему, чем принятый ответ, для коротких файлов XML:

Пример XML:

   50058 -0.16   3.4610 +0.29   3.7673 -0.25  04/08/15 - 18:14  

Внедрить счетчик:

 @implementation className{ int parserCounter; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { parserCounter++; NSLog(@"%d: %@",contadorParser,string); if (parserCounter == 3) doAnythingFor3; if (parserCounter == 5) doAnythingFor5; if (parserCounter == 9) doAnythingFor9; if (parserCounter == 11) doAnythingFor11; if (parserCounter == 15) doAnythingFor15; if (parserCounter == 17) doAnythingFor17; if (parserCounter == 20) doAnythingFor20; } 

Как я узнаю, что число ведьм – это ведьма? Увидев журнал. Это будет что-то вроде:

 2015-08-04 23:36:08.070 Tesouro Direto[7252:1554402] 1: 2015-08-04 23:36:08.070 Tesouro Direto[7252:1554402] 2: 2015-08-04 23:36:08.071 Tesouro Direto[7252:1554402] 3: 50058 2015-08-04 23:36:08.105 Tesouro Direto[7252:1554402] 4: 2015-08-04 23:36:08.105 Tesouro Direto[7252:1554402] 5: -0.16 2015-08-04 23:36:08.131 Tesouro Direto[7252:1554402] 6: 2015-08-04 23:36:08.132 Tesouro Direto[7252:1554402] 7: 2015-08-04 23:36:08.132 Tesouro Direto[7252:1554402] 8: 2015-08-04 23:36:08.132 Tesouro Direto[7252:1554402] 9: 3.4610 2015-08-04 23:36:08.156 Tesouro Direto[7252:1554402] 10: 2015-08-04 23:36:08.156 Tesouro Direto[7252:1554402] 11: +0.29 2015-08-04 23:36:08.180 Tesouro Direto[7252:1554402] 12: 2015-08-04 23:36:08.180 Tesouro Direto[7252:1554402] 13: 2015-08-04 23:36:08.180 Tesouro Direto[7252:1554402] 14: 2015-08-04 23:36:08.180 Tesouro Direto[7252:1554402] 15: 3.7673 2015-08-04 23:36:08.203 Tesouro Direto[7252:1554402] 16: 2015-08-04 23:36:08.203 Tesouro Direto[7252:1554402] 17: -0.25 2015-08-04 23:36:08.226 Tesouro Direto[7252:1554402] 18: 2015-08-04 23:36:08.227 Tesouro Direto[7252:1554402] 19: 2015-08-04 23:36:08.227 Tesouro Direto[7252:1554402] 20: 04/08/15 - 18:14 2015-08-04 23:36:08.227 Tesouro Direto[7252:1554402] 21: 

Журнал покажет вам номер ведьмы – это каждый узел.

  • Какой XML-парсер следует использовать в C ++?
  • Почему такая плохая идея анализировать XML с помощью регулярного выражения?
  • Как разбирать тег с тем же именем в Android XML DOM Parsing
  • Как разобрать XML с помощью jsoup
  • Обновления просмотра списка Android
  • В чем разница между SAX и DOM?
  • findViewById () возвращает null - попробовал ВСЕ
  • Разрешены ли разрывы строк в значениях атрибутов XML?
  • Interesting Posts

    Сканер next () бросает NoSuchElementException для некоторых онлайн-компиляторов

    Ваша машина отключена, пожалуйста, попробуйте войти в систему с последним паролем, используемым на этом ПК.

    Как повысить привилегии только в случае необходимости?

    Определение, является ли число простым

    Какими способами запрещается записывать или читать файлы с символом правостороннего переопределения Unicode в их имени (метод подмены вредоносных программ)?

    Простые логические операторы в Bash

    Почему я не могу заблокировать https?

    Есть ли способ «ограничить» результат с помощью ELOQUENT ORM Laravel?

    импортирование CSV в phpmyadmin

    Как узнать, является ли DateTime между DateRange в C #

    Если я синхронизировал два метода в одном classе, они могут работать одновременно?

    GUI работает со скоростью 30 кадров в секунду?

    Диски превратились в Простой том, НЕ МОЖЕТ переформатировать

    Показать прогрессDialog Android

    Метапрограммирование: отказ определения функции Определяет отдельную функцию

    Давайте будем гением компьютера.