XML парсинг основ

Существенные шаги для парсинга XML-документа с помощью NSXMLParser являются прямыми. Это требует, чтобы Вы завершили выполняющие общие шаги:

  1. Найдите XML.

    Перечисление 1 показывает код, позволяющий пользователю выбрать XML-файл из браузера файловой системы (NSOpenPanel).



    Перечисление 1  , Открывающее XML-файл

    - (void)openXMLFile {
     
        NSArray *fileTypes = [NSArray arrayWithObject:@"xml"];
        NSOpenPanel *oPanel = [NSOpenPanel openPanel];
        NSString *startingDir = [[NSUserDefaults standardUserDefaults] objectForKey:@"StartingDirectory"];
        if (!startingDir)
            startingDir = NSHomeDirectory();
        [oPanel setAllowsMultipleSelection:NO];
        [oPanel beginSheetForDirectory:startingDir file:nil types:fileTypes
          modalForWindow:[self window] modalDelegate:self
          didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
          contextInfo:nil];
    }
     
    - (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
        NSString *pathToFile = nil;
        if (returnCode == NSOKButton) {
            pathToFile = [[[sheet filenames] objectAtIndex:0] copy];
        }
        if (pathToFile) {
            NSString *startingDir = [pathToFile stringByDeletingLastPathComponent];
            [[NSUserDefaults standardUserDefaults] setObject:startingDir forKey:@"StartingDirectory"];
            [self parseXMLFile:pathToFile];
        }
    }

    Несмотря на то, что XML-файл является общим падежом, источник XML не мог бы быть файлом. Вы могли получить XML от другого объекта как объект списка свойств (такой как NSDictionary) или как поток байтов по сети. В случаях как они необходимо преобразовать форму XML к объекту NSData прежде, чем инициализировать экземпляр NSXMLParser (см. следующий шаг),

  2. Создайте и инициализируйте экземпляр NSXMLParser., гарантируя, что Вы устанавливаете делегата.

    Перечисление 2 иллюстрирует, как Вы могли бы сделать это.



      Создание перечисления 2 и инициализация экземпляра NSXMLParser

    - (void)parseXMLFile:(NSString *)pathToFile {
        BOOL success;
        NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile];
        if (addressParser) // addressParser is an NSXMLParser instance variable
            [addressParser release];
        addressParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
        [addressParser setDelegate:self];
        [addressParser setShouldResolveExternalEntities:YES];
        success = [addressParser parse]; // return value not used
                    // if not successful, delegate is informed of error
    }

    В этом методе объект клиента преобразовывает путь к XML-файлу к объекту NSURL и затем использует тот объект инициализировать экземпляр NSXMLParser с initWithContentsOfURL:. Это также устанавливает делегата, чтобы быть собой и позволяет синтаксическому анализатору знать, что это хочет разрешить внешние объекты (такие как внешние объявления DTD). Другие методы NSXMLParser позволяют Вам установить различные связанные с пространством имен опции. Наконец, клиент отправляет parse к экземпляру NSXMLParser для имения его начинают анализировать XML.

    Если бы XML был в некоторой форме кроме файла, то Вы преобразовали бы его в объект NSData и затем использовали бы initWithData: инициализатор:

    addressParser = [[NSXMLParser alloc] initWithData:xmlData];
  3. Реализуйте методы делегации, представляющие интерес для Вас.

    Когда объект NSXMLParser анализирует XML, он отправляет, сообщение его делегату к каждому XML создают его обнаружение (но только если делегат реализует связанный метод). Реализации этих методов варьируются типом конструкции: объявления DTD, префиксы пространства имен, элементы, и т.д. Элементы являются наиболее распространенным типом обработанной конструкции XML; посмотрите Обработку Элементы XML и Атрибуты для подробных данных.

    Все операции парсинга начинаются с делегата, получающего parserDidStartDocument: и конец с делегатом, получающим parserDidEndDocument: (принятие, конечно, делегат реализует методы). Прежний метод предлагает возможность для выделения и установки ресурсов, необходимых для работы парсинга; последний метод является хорошим местом, чтобы высвободить те средства и должным образом избавиться от любого результата.

  4. Обработайте любые ошибки анализа.

    Если синтаксический анализатор встречается с ошибкой, он прекращает анализировать и вызывает метод делегации parser:parseErrorOccurred:. Реализуйте этот метод, чтобы интерпретировать ошибку и сообщить пользователю. (Все ошибки синтаксического анализатора являются невосстановимыми.) Посмотрите Ошибки анализа Обработки для получения дополнительной информации.

Управление памятью становится усиленным беспокойством при парсинге XML. Обработка XML часто требует, чтобы Вы создали много объектов; Вы не должны позволять этим объектам накопиться в памяти мимо их промежутка полноценности. Один метод для контакта с этими сгенерированными объектами для делегата, чтобы создать локальный автовыпуск пулы в начале каждого реализованного метода делегации и выпустить пул автовыпуска как раз перед возвратом. NSXMLParser управляет памятью для каждого объекта, который она создает и отправляет делегату.