Требования к операционной системе: iOS 5.0 и выше.
Мобильное устройство: iPad.
В данном примере показаны некоторые приемы поиска вложенных объектов в XML-элементе аналитической панели. После его запуска выполняются следующие операции:
извлекается XML-элемент аналитической панели с помощью метода APXMLParser.parseXML:;
из массива вложенных объектов XML-элемента извлекается дочерний XML-элемент;
из дочернего XML-элемента по заданному тэгу извлекается вложенный XML-элемент;
для полученного элемента по заданным ключам извлекаются целочисленное, вещественное и логическое значения некоторых свойств;
по заданному ключу из полученного элемента извлекается вложенный XML-объект, представляющий заданное свойство;
извлекается наименование полученного XML-объекта;
из XML-элемента аналитической панели извлекается массив вложенных XML-элементов, для которых задан ключ;
осуществляется поиск XML-элемента по заданному ключу в верхнем уровне вложения родительского и корневого XML-элементов;
осуществляется поиск XML-элемента по заданному ключу во всех уровнях вложения с началом поиска в корневом XML-элементе;
осуществляется поиск XML-элемента по заданному наименованию во всех уровнях вложения с началом поиска в корневом XML-элементе;
осуществляется поиск XML-элемента по заданному наименованию во всех уровнях вложения с началом поиска в найденном ранее элементе;
извлекается массив всех вложенных XML-элементов дочернего элемента по заданному наименованию;
извлекается массив XML-элементов по заданному наименованию в первом уровне вложения дочернего XML-элемента;
осуществляется поиск XML-элемента по заданному наименованию в верхнем уровне вложения родительского и корневого XML-элементов.
Для выполнения примера необходимо разместить в теле метода executeExample класса ViewController (см. раздел «Отображение аналитической панели») следующий код:
// Получаем контроллер аналитической панели
MADashboardReportViewController* dashboard = (MADashboardReportViewController *)m_controller;
// Получаем путь к XML-файлу, описывающему аналитическую панель
NSArray *resourcesPaths = [[dashboard delegate] dashboardResourcesPath];
NSString *xmlPath = (NSString *)[resourcesPaths objectAtIndex:0];
// Получаем данные из xml-файла
NSData *xmlData = [NSData dataWithContentsOfFile:xmlPath];
// Получаем XML-объект аналитической панели
APXMLParserObject *xmlObject = [APXMLParser parseXML:xmlData];
// Получаем дочерний XML-объект в массиве вложенных объектов
APXMLParserObject *xmlSecondObj = [[xmlObject objects] objectAtIndex:0];
// Получаем вложенный XML-элемент с тэгом «background»
APXMLParserObject *objectWithTag = [xmlSecondObj objectWithTag:@"background"];
if(objectWithTag != nil)
{
// Получаем целочисленное значение свойства с ключом «gradientAngle»
BOOL hasProp = [objectWithTag hasPropForKey:@"gradientAngle"];
int prop = hasProp?[objectWithTag intPropForKey:@"gradientAngle"] : 0;
// Получаем вещественное значение свойства с ключом «gradientAngle»
double prop2 = [objectWithTag doublePropForKey:@"gradientAngle"];
// Получаем значение логического типа для свойства с ключом «useBackground»
BOOL prop3 = [objectWithTag boolPropForKey:@"useBackground"];
// Получаем XML-элемент, представляющий свойство с ключом «backgroundColor»
APXMLParserObject *backgroundColorObject = [objectWithTag objectPropForKey:@"backgroundColor"];
// Получаем наименование xml-элемента с ключом «backgroundColor»
NSString *elementName = [backgroundColorObject elementName];
// Выводим в консоль среды разработки полученную информацию
NSLog(@"Целочисленное значение свойства с ключом «gradientAngle»: %d", prop);
NSLog(@"Вещественное значение свойства с ключом «gradientAngle»: %f", prop2);
NSString *boolString = prop3? @"YES": @"NO";
NSLog(@"Значение логического типа для свойства с ключом «useBackground»: %@",boolString);
NSLog(@"Наименование XML-элемента с ключом «backgroundColor»: %@", elementName);
}
else
{
NSLog(@"Элемент с тэгом «background» не найден");
}
// Получаем массив вложенных XML-элементов, для которых задан ключ
NSDictionary *objectsWithIDs = [xmlObject objectsWithIDs];
// Получаем массив ключей XML-элементов, для которых задан ключ
NSArray *objectsKeys = [objectsWithIDs allKeys];
// Получаем последний ключ в массиве
NSString *key = [objectsKeys objectAtIndex:[objectsKeys count] - 1];
// Получаем XML-элемент по ключу
APXMLParserObject *objectWithID = [objectsWithIDs valueForKey: key];
// Сохраняем значение ключа в новой строке
NSString *idOfObject = [objectWithID ID];
// Получаем родительский элемент для полученного XML-элемента
APXMLParserObject *parentObject = [objectWithID parent];
// Осуществляем поиск элемента по ключу в верхнем уровне вложения родительского элемента
APXMLParserObject *objectForID = [parentObject objectForID: idOfObject];
// Осуществляем поиск элемента по ключу в верхнем уровне вложения корневого элемента
APXMLParserObject *objectForID2 = [xmlObject objectForID: idOfObject];
// Осуществляем поиск элемента по ключу во всех уровнях вложения, начиная с корневого элемента
APXMLParserObject *objectForID3 = [xmlObject findObjectForID: idOfObject];
// Выводим в консоль среды разработки результаты поиска элементов
NSString *rootName =[xmlObject elementName];
NSString *parentName =[parentObject elementName];
if(objectForID != nil)
{
NSString *objectForIDName = [objectForID elementName];
NSLog(@"Найден элемент %@ в верхнем уровне вложения элемента %@", objectForIDName, parentName);
}
else NSLog(@"Элемент c ключом %@ не найден", idOfObject);
if(objectForID2 != nil)
{
NSString *objectForID2Name = [objectForID2 elementName];
NSLog(@"Найден элемент %@ в верхнем уровне вложения элемента %@", objectForID2Name, rootName);
}
else NSLog(@"Элемент c ключом %@ не найден", idOfObject);
if(objectForID3 != nil)
{
NSString *objectForID3Name = [objectForID3 elementName];
NSLog(@"Найден элемент %@ в уровнях вложения элемента %@", objectForID3Name, rootName);
}
else NSLog(@"Элемент c ключом %@ не найден", idOfObject);
// Задаем наименование, по которому будет осуществляться поиск элементов
NSString *nameOfObject = @"prop";
// Осуществляем поиск элемента во всех уровнях вложения по заданному наименованию
APXMLParserObject *objectOfName = [xmlObject findObjectOfElementName:nameOfObject];
if(objectOfName != nil)
{
// Осуществляем поиск элемента во всех уровнях вложения по заданному наименованию, начиная с найденного ранее элемента
APXMLParserObject *objectOfName2 = [xmlObject findObjectOfElementName:nameOfObject startingAt:objectOfName];
if(objectOfName2 != nil)
{
// Сравниваем полученные элементы и выводим в консоль среды разработки результат сравнения
if([objectOfName2 isEqual:objectOfName] == YES) NSLog(@"Элементы, полученные по наименованию двумя способами, равны");
else NSLog(@"Элементы, полученные по наименованию двумя способами, не равны");
}
else NSLog(@"Элемент с наименованием %@ не найден во вложенных уровнях первого найденного элемента", nameOfObject);
}
else NSLog(@"Элемент с наименованием %@ не найден", nameOfObject);
// Получаем по заданному наименованию массив всех вложенных XML-элементов дочернего элемента
NSArray *findedObjects = [xmlSecondObj findObjectsOfElementName: nameOfObject];
// Получаем массив XML-элементов по заданному наименованию в первом уровне вложения дочернего элемента
NSArray *findedObjects2 = [xmlSecondObj objectsForElementName: nameOfObject];
// Выводим в консоль среды разработки информацию о полученных массивах
NSLog(@"Количество элементов с наименованием %@, полученных во всех уровнях вложения дочернего элемента: %d", nameOfObject, [findedObjects count]);
NSLog(@"Количество элементов с наименованием %@, полученных в верхнем уровне вложения дочернего элемента: %d", nameOfObject, [findedObjects2 count]);
// Задаем новое наименование, по которому будет осуществляться поиск элементов
nameOfObject = @"area";
// Осуществляем поиск элемента по наименованию в верхнем уровне вложения, начиная с корневого элемента
APXMLParserObject *objectOfName3 = [xmlObject objectForElementName: nameOfObject];
// Осуществляем поиск элемента по наименованию во всех уровнях вложения, начиная с корневого элемента
APXMLParserObject *objectOfName4 = [xmlObject findObjectOfElementName: nameOfObject];
//Выводим в консоль среды результаты поиска элементов
if(objectOfName3 != nil)
{
NSLog(@"Найден элемент %@ в верхнем уровне вложения корневого элемента", nameOfObject);
}
else NSLog(@"Элемент c наименованием %@ не найден в верхнем уровне корневого элемента", nameOfObject);
if(objectOfName4 != nil)
{
NSLog(@"Найден элемент %@ в иерархии корневого элемента", nameOfObject);
// Получаем родительский элемент найденного элемента
APXMLParserObject *parentObject2 = [objectOfName4 parent];
// Осуществляем поиск элемента по наименованию в верхнем уровне вложения родительского элемента
APXMLParserObject *objectOfName5 = [parentObject2 objectForElementName: nameOfObject];
if(objectOfName5 != nil)
{
NSString *parentObject2Name = [parentObject2 elementName];
NSLog(@"Найден элемент %@ в верхнем уровне вложения элемента %@", nameOfObject, parentObject2Name);
}
else NSLog(@"Элемент c ключом %@ не найден", idOfObject);
}
else NSLog(@"Элемент c наименованием %@ не найден в иерархии корневого элемента", nameOfObject);
В результате выполнения примера в консоли среды разработки была выведена информация о полученных значениях свойств XML-элементов, наименование XML-элемента, найденного с помощью заданного ключа, результаты поиска элементов различными способами, информация о массивах найденных различными способами элементов, а также результат сравнения элементов, которые были найдены различными способами по одному и тому же наименованию:
Целочисленное значение свойства с ключом «gradientAngle»: 270
Вещественное значение свойства с ключом «gradientAngle»: 270.000000
Значение логического типа для свойства с ключом «useBackground»: NO
Наименование XML-элемента с ключом «backgroundColor»: prop
Найден элемент block в верхнем уровне вложения элемента area
Элемент c ключом 7HBEWOKE7UKGM6VB не найден
Найден элемент block в уровнях вложения элемента kap
Элементы, полученные по наименованию двумя способами, не равны
Количество элементов с наименованием prop, полученных во всех уровнях вложения дочернего элемента: 300
Количество элементов с наименованием prop, полученных в верхнем уровне вложения дочернего элемента: 4
Элемент c наименованием area не найден в верхнем уровне корневого элемента
Найден элемент area в иерархии корневого элемента
Найден элемент area в верхнем уровне вложения элемента prop
См. также: