Хотя встроенный XML parser добавляет реальную ценность новому настольному или мобильному приложению, кодирование этой функциональности обычно требует много времени на разработку и бета-тестирование. Программа Apple Xcode включает синтаксический анализатор XML, который позволяет обойти большую часть этой ручной работы.
An XML файл может содержать что угодно, от базовых данных о вашем приложении до Новостная лента для веб-сайта. Они также могут быть отличным способом удаленного обновления информации в вашем приложении, тем самым избегая необходимости отправлять новый двоичный файл в Apple, просто чтобы добавить новый элемент в список.
Процесс Xcode
Встроенный процесс Xcode содержит шаги для инициализации переменных, которые будут использоваться, запуска процесса синтаксического анализатора XML, подачи этому процессу файла, оценка отдельных элементов и символов (значения) в этих элементах, распознавание конца отдельного элемента и завершение синтаксического анализа процесс.
Используйте синтаксический анализатор 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-файле.
Далее инициализируем процесс:
- (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]];
[запрос setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: запрос returnResponse: nil error: nil];
статьи = [[NSMutableArray alloc] инициализация];
errorParsing = НЕТ;
rssParser = [[выделение NSXMLParser] initWithData: xmlFile];
[rssParser setDelegate: сам];
// Вам может потребоваться включить некоторые из них в зависимости от типа XML-файла, который вы анализируете
[rssParser setShouldProcessNamespaces: НЕТ];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[анализ rssParser];
}
Эта функция инструктирует движок загрузить файл по определенному веб-адресу (URL) и запустить процесс его анализа. Мы сообщаем удаленному серверу, что мы являемся Safari, работающим на Mac, на случай, если сервер попытается перенаправить iPhone / iPad на мобильную версию.
Параметры в конце относятся к определенным файлам XML. Для большинства файлов RSS и обычных файлов XML их не нужно включать.
Ошибка - проверьте результат
Выполните базовую проверку результата на ошибки:
- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Код ошибки% i", [parseError code]];
NSLog (@ "Ошибка синтаксического анализа XML:% @", errorString);
errorParsing = ДА;
} Эта маршрутизация с проверкой ошибок устанавливает двоичное значение, если обнаруживает ошибку. Здесь вам может понадобиться что-то более конкретное, в зависимости от того, что вы делаете. Если вам просто нужно запустить какой-то код после обработки в случае ошибки,
Эта процедура проверки ошибок устанавливает двоичное значение, если обнаруживает ошибку. Здесь вам может понадобиться что-то более конкретное, в зависимости от того, что вы делаете. Если вам просто нужно запустить какой-то код после обработки в случае ошибки, в это время можно вызвать двоичную переменную анализа ошибок.
Анализируйте полученный контент
Затем программа разбивает полученный контент и анализирует его:
- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
currentElement = [elementName копия];
ElementValue = [[выделение NSMutableString] инициализация];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] инициализация];
}
}
Основа синтаксического анализатора XML состоит из трех функций, одна из которых запускается в начале отдельного элемент, один из которых выполняется во время анализа элемента, а второй - в конце элемент.
В этом примере мы проанализируем файл, аналогичный файлам RSS, который разбивает элементы на группы под заголовком Предметы в файле XML. В начале обработки мы проверяем имя элемента «item» и выделяем наш словарь элементов при обнаружении новой группы. В противном случае мы инициализируем нашу переменную для значения:
- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
[ElementValue appendString: строка];
}
Когда мы находим символы, мы просто добавляем их в нашу переменную ElementValue:
- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[статьи addObject: [копия статьи]];
} еще {
[item setObject: ElementValue forKey: elementName];
}
}
Что происходит после завершения синтаксического анализа
Когда программа завершает обработку элемента, она должна выполнить одно из двух:
- Если конечный элемент пункт, мы закончили нашу группу, поэтому мы добавим наш словарь в наш массив статей.
- Если элемент не пункт, мы установим значение в нашем словаре с ключом, который соответствует имени элемента. (Это означает, что нам не нужна отдельная переменная для каждого поля в XML-файле. Мы можем обрабатывать их более динамично.)
Это последняя функция, необходимая для нашей процедуры синтаксического анализа; он заканчивает документ. Поместите сюда окончательный код или укажите подпрограмму исправления ошибок:
- (void) parserDidEndDocument: (NSXMLParser *) parser {
если (errorParsing == НЕТ)
{
NSLog (@ "Обработка XML завершена!");
} еще {
NSLog (@ "Ошибка при обработке XML");
}
}
Сохраните данные
Многие приложения могут захотеть здесь сохранить данные или XML-файл в файл на устройстве. Таким образом, если устройство не подключено к Интернету при следующей загрузке приложения, оно все равно сможет получить эту информацию.
Конечно, мы не можем забыть самую важную часть: указание вашему приложению проанализировать файл (и дать ему веб-адрес, по которому он будет найден!). Чтобы начать процесс, добавьте эту строку кода в соответствующее место, где вы хотите выполнить обработку XML:
[self parseXMLFileAtURL: @ " http://www.webaddress.com/file.xml"];