Как разобрать XML-файлы в Xcode

Одной простой задачей, которая является основой для многих приложений, является возможность анализа файлов XML. И, к счастью, Xcode позволяет относительно легко анализировать XML-файл в Objective-C.

XML-файл может содержать что угодно, от основных данных о вашем приложении до RSS-канала для веб-сайта. Они также могут быть отличным способом удаленного обновления информации в вашем приложении, что исключает необходимость отправки нового двоичного файла в Apple, просто чтобы добавить новый элемент в список.

Итак, как мы обрабатываем файлы XML в XCode? Процесс содержит шаги для инициализации переменных, которые будут использоваться, запуска процесса синтаксического анализатора XML, подачи этого процесса в файл, начала отдельного элемента, символов (значения) внутри элемента, конца отдельного элемента и конца процесса разбора.

В этом примере мы будем анализировать файл из Интернета, передав ему определенный веб-адрес (URL).

Мы начнем с создания файла заголовка. Это пример очень простого заголовочного файла для контроллера подробного представления с минимальными требованиями для анализа нашего файла:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;
NSXMLParser * rssParser;
NSMutableArray * статьи;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}
@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;

Функция parseXMLFileAtURL запустит процесс для нас. Когда он закончится, NSMutableArray «article» будет содержать наши данные. Массив будет состоять из изменяемых словарей с ключами, связанными с именами полей в файле XML.

Теперь, когда мы установили необходимые переменные, мы перейдем к встрече процесса в файле .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Файл найден и синтаксический анализ запущен");
}

Эта функция запускается в начале процесса. Нет необходимости помещать что-либо в эту функцию, но если вы хотите выполнить задачу, когда файл начинает анализироваться, вы должны поместить свой код.

- (void) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ru-ru) AppleWebKit / 525.27.1 (KHTML, как Gecko) Версия / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: запрос returningResponse: nil ошибка: nil];
статьи = [[NSMutableArray alloc] init];
errorParsing = NO;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Возможно, вам придется включить некоторые из них в зависимости от типа файла XML, который вы анализируете
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}

Эта функция инструктирует движок загрузить файл по определенному веб-адресу (URL) и запустить процесс его анализа. Мы сообщаем удаленному серверу, что мы Safari, работающий на Mac, на тот случай, если сервер попытается перенаправить iPhone / iPad на мобильную версию.
Параметры в конце относятся к определенным файлам XML. Большинство файлов RSS и общих файлов XML не требуют их включения.

- (void) анализатор: (NSXMLParser *) анализатор parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Код ошибки% i", [код parseError]];
NSLog (@ "Ошибка синтаксического анализа XML:% @", errorString);
errorParsing = ДА;
}

Это простая маршрутизация с проверкой ошибок, которая устанавливает двоичное значение в случае обнаружения ошибки. Здесь вам может понадобиться что-то более конкретное в зависимости от того, что вы делаете. Если вам просто нужно запустить какой-то код после обработки в случае ошибки, тогда можно вызвать двоичную переменную errorParsing.

- (void) синтаксический анализатор: (NSXMLParser *) анализатор didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualName: (NSString *) qName атрибуты: (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];
}
}

Основная часть синтаксического анализатора XML содержит три функции, одна из которых выполняется в начале отдельного элемента, другая — в середине синтаксического анализа элемента, а вторая — в конце элемента.

В этом примере мы будем разбирать файл, похожий на файл RSS, который разбивает элементы на группы под заголовком «элементы» в файле XML. В начале обработки мы проверяем имя элемента «item» и выделяем наш словарь item при обнаружении новой группы. В противном случае мы инициализируем нашу переменную для значения.

- (void) анализатор: (NSXMLParser *) анализатор foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Это легкая часть. Когда мы находим символы, мы просто добавляем их в нашу переменную «ElementValue».

- (void) анализатор: (NSXMLParser *) синтаксический анализатор didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[статьи addObject: [копия элемента]];
} еще {
[item setObject: ElementValue forKey: elementName];
}
}

Когда мы закончили обработку элемента, нам нужно сделать одну из двух вещей: (1) если конечным элементом является «item», мы закончили нашу группу, поэтому мы добавим наш словарь в наш массив «статей ». Или (2) если элемент не «item», мы установим значение в нашем словаре с ключом, который соответствует имени элемента. (Это означает, что нам не нужна отдельная переменная для каждого поля в XML-файле. Мы можем обрабатывать их немного более динамично.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {
if (errorParsing == НЕТ)
{
NSLog (@ "Обработка XML выполнена!");
} еще {
NSLog (@ "Ошибка во время обработки XML");
}
}

Это последняя функция, необходимая для нашей процедуры анализа. Это просто заканчивает документ. Здесь вы разместите любой код, который хотите завершить, или что-то особенное, что вы можете сделать в случае ошибки.

Многие приложения могут захотеть сохранить данные и / или XML-файл в файл на устройстве. Таким образом, если пользователь не подключится к Интернету при следующей загрузке приложения, он все равно сможет получить эту информацию.

Конечно, мы не можем забыть самую важную часть: указание приложению проанализировать файл (и указать ему веб-адрес, чтобы найти его по адресу!).

Чтобы начать процесс, вам просто нужно добавить эту строку кода в соответствующее место, где вы хотите выполнить обработку XML:

          [self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];
Ссылка на основную публикацию