Одной из простых задач, которая является основой для многих приложений, является возможность анализировать 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 (неатомный, сохранить) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;Функция parseXMLFileAtURL запустит процесс для нас. Когда он закончится, наши статьи «NSMutableArray» будут содержать наши данные. Массив будет состоять из изменяемых словарей с ключами, связанными с именами полей в файле 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-us) 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: запрос returnResponse: nil error: nil;articles = 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) parser: (NSXMLParser *) парсер parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Код ошибки% i", parseError code;NSLog (@ "Анализ ошибок XML:% @", errorString);errorParsing = ДА;}Это простая проверка ошибок, которая установит двоичное значение, если оно встретит ошибку. В зависимости от того, что вы делаете, вам может понадобиться нечто более конкретное. Если вам просто нужно запустить некоторый код после обработки в случае ошибки, в это время можно вызывать двоичную переменную errorParsing.
- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} Мяг синтаксического анализатора XML содержит три функции, которые запускаются в начале отдельного элемента, который выполняется во время разбора элемента, а другой - в конце элемента. В этом примере мы будем разбирать файл, похожий на файлы RSS, которые разбивают элементы на группы под заголовком «элементы» в файле XML. В начале обработки мы проверяем имя элемента «item» и выделяем наш словарь товаров, когда обнаруживается новая группа. В противном случае мы инициализируем нашу переменную для значения.
- (void) парсер: (NSXMLParser *) парсер foundCharacters: (NSString *) string {ElementValue appendString: строка;} Это легкая часть. Когда мы находим символы, мы просто добавляем их в нашу переменную «ElementValue».
- (void) парсер: (NSXMLParser *) парсер didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if (elementName isEqualToString: @ "item") {articles addObject: item copy;} else {item setObject: ElementValue forKey: elementName;}} Когда мы закончили обработку элемента, нам нужно сделать одну из двух вещей: (1) если конечный элемент «item», мы закончили нашу группу, поэтому мы добавим наш словарь в наш массив статей ». Или (2), если элемент не является «элементом», мы установим значение в нашем словаре с ключом, который соответствует имени элемента. (Это означает, что нам не нужна отдельная переменная для каждого поля в файле XML. Мы можем обрабатывать их немного динамически.)
- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ «Обработка XML выполнена!»);} else {NSLog (@ «Ошибка при обработке XML»);}} Это последняя функция, необходимая для нашей процедуры синтаксического анализа. Он просто заканчивает документ. Вы поместите любой код, который хотите завершить здесь, или что-то особенное, которое вы, возможно, захотите сделать в случае ошибки. Одна вещь, которую многие приложения могут захотеть сделать, это сохранить данные и / или файл XML в файл на устройстве. Таким образом, если пользователь не подключен к Интернету в следующий раз, когда загружает приложение, он все равно может получить эту информацию. Конечно, мы не можем забыть самую важную часть: сообщить вашему приложению проанализировать файл (и дать ему веб-адрес, чтобы его найти!). Чтобы начать процесс, вам просто нужно добавить эту строку кода в нужное место, где вы хотите выполнить обработку XML:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";