2010-07-22 6 views
0

В моем приложении я разбираю xml, из которого я получаю список предметов (гостиниц и ресторанов), которые я ввел в массив «listElements»; Мне нужно получить от этого массива, другой массив, который будет содержать только определенные элементы (только отели), а затем мне нужно добраться из этого массива, трех массивов, которые будут содержать отели по звездам (array5starhotel, array4starhotel, array3starhotel). Как это можно сделать? Это код, который я использовал для разбора (я использовал TBXML):извлечение данных из NSMutableArray

- (void)loadCategories { 
    // instantiate an array to hold categories objects 
    listCategories = [[NSMutableArray alloc] initWithCapacity:100]; 

    tbxml = [[TBXML tbxmlWithXMLFile:@"Molise.xml"] retain]; 

    // Obtain root element 
    TBXMLElement * root = tbxml.rootXMLElement; 

    // if an author element was found 
    if (root) { 
     //search for the first category element within the root element's children 
     TBXMLElement * category = [TBXML childElementNamed:@"category" parentElement:root]; 

     // if a category element was found 
     while (category != nil) { 

     // instantiate a category object 
     Category * aCategory = [[Category alloc] init]; 

     // get the name attribute from the category element 
     aCategory.name = [TBXML valueOfAttributeNamed:@"name" forElement:category]; 

     // search the category's child elements for a "element" element 
     TBXMLElement * element = [TBXML childElementNamed:@"element" parentElement:category]; 

     // if a "element" element was found  
     while (element != nil) {        

      // instantiate a "element" object 
      Element * aElement = [[Element alloc] init]; 

      // extract the attributes from the "element" element 
      aElement.title = [TBXML valueOfAttributeNamed:@"title" forElement:element]; 
      aElement.address = [TBXML valueOfAttributeNamed:@"address" forElement:element];   
      aElement.stars =[TBXML valueOfAttributeNamed:@"stars" forElement:element]; 

      // add the "element" object to the category's listElements array and release the resource  
      [aCategory.listElements addObject:aElement]; 
      [aElement release]; 

      // find the next sibling element named "element" 
      element = [TBXML nextSiblingNamed:@"element" searchFromElement:element]; 
     } 

     // add our category object to the listCategories array and release the resource 
     [listaCategories addObject:aCategory]; 
     [aCategory release]; 

     // find the next sibling element named "category" 
     category = [TBXML nextSiblingNamed:@"category" searchFromElement:category]; 
     }      

     [tbxml release]; 
    } 

ответ

1

ОК, так что ваш фрагмент кода не делает то, что говорит этот вопрос он делает.

Вы создаете массив категорий (listCategories), содержащий множество объектов категории. Каждый из них содержит массив listElements.

Предполагая, что вы хотите товары из категории «отели». , ,

// Get the hotels category 
Category *hotelsCategory = nil; 
for (Category *temp in listCategories.each) { 
    if ([temp.name isEqualToString:@"hotel"]) { 
    hotelsCategory = temp; 
    break; 
    } 
} 
if (nil == hotelsCategory) 
    return NSLog(@"No hotels category found"); 

// Get the hotels from this category with a 3 or above star rating 
NSMutableArray *array5starhotel = [NSMutableArray array]; 
NSMutableArray *array4starhotel = [NSMutableArray array]; 
NSMutableArray *array3starhotel = [NSMutableArray array]; 
for (Element *element in hotelsCategory.listElements) { 
    if ([element.stars isEqualToString:@"5"]) 
    [array5starhotel addObject:element]; 
    if ([element.stars isEqualToString:@"4"]) 
    [array4starhotel addObject:element]; 
    if ([element.stars isEqualToString:@"3"]) 
    [array3starhotel addObject:element]; 
} 

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

+0

Я объясню, что лучше в классе Category создается экземпляр «name» (category.name) и массив listElement (category.listElement); в элементе класса создаются три строки: название, описание, звезды (element.title, element.stars element.description.) Причина, по которой я спросил, как сделать три массива, заключается в том, что когда я нажимаю на категорию отеля, мне нужно показать отели по звездам в трех разных разделах таблицыView – Claudio

+0

ОК, вторая часть моего кода будет проходить через один объект категории и получить три требуемых массива. – deanWombourne

+0

dean У меня проблема с вашим кодом, в трех массивах всегда загружается один и тот же отель (первый из дерева XML), на самом деле в трех разделах табличного представления я получаю тот же отель, когда они должны появляться три разных – Claudio

1

NSArray s [filteredArrayUsingPredicate:][1] является инструментом для этой работы.

Как уже отмечалось, массив listCategories будет содержать массив из Category объектов с каждой категорией, содержащей массив из Element объектов.

// Retrieve "hotel" Elements 

NSPredicate *hotelPredicate = [NSPredicate predicateWithFormat:@"name == hotel"]; 
Category *hotelCategory = [[[listCategories filteredArrayUsingPredicate:hotelPredicate] objectAtIndex: 0] retain]; 

NSArray *hotels = [[hotelCategory listElements] retain]; 

// Split the array of Elements based on star value 
NSPredicate *elementRatingTemplate = [NSPredicate predicateWithFormat:@"stars == $STARS"]; 

NSPredicate *threeStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"3" forKey:@"STARS"]; 

NSArray *threeStarHotels = [[hotels filteredArrayUsingPredicate: threeStarPredicate] retain]; 

NSPredicate *fourStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"4" forKey:@"STARS"]; 

NSArray *fourStarHotels = [[hotels filteredArrayUsingPredicate: fourStarPredicate] retain]; 

NSPredicate *fiveStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"5" forKey:@"STARS"]; 

NSArray *fiveStarHotels = [[hotels filteredArrayUsingPredicate: fiveStarPredicate] retain]; 

// Do something with the filtered arrays 
// Clean up retained objects. 
+0

falcon, компилятор дает мне различные ошибки с этим кодом – Claudio

+0

вы можете их разместить? SO не является отличным компилятором ..... – falconcreek

+0

NSPredicateTemplate не существует, NSArray может не отвечать на listElements, ошибка: ожидается ':' перед 'токеном' и путается с более ранними ошибками, спасаясь после NSArray * threeStarHotels – Claudio

Смежные вопросы