Поиск вложенных объектов в xml-элементе аналитической панели

Требования к операционной системе: iOS 5.0 и выше.

Мобильное устройство: iPad.

Описание

В данном примере показаны некоторые приемы поиска вложенных объектов в 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

См. также:

Примеры использования компонентов