2013-08-26 19 views
6

Próbuję przeanalizować dane podrzędne, które są podkategoriami i pokazać je, ale będą wyświetlać tylko odpowiednią podkategorię kategorii nadrzędnej. Udało mi się przeanalizować dane elementu nadrzędnego, ale mam problem z analizą elementu potomnego.Uzyskiwanie danych elementu potomnego od jego odpowiednika rodzica

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    if([elementName isEqualToString:@"category"]){ 
     dataCurrent = [dataFileHolder alloc]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    currentList = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 

} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if([elementName isEqualToString:@"name"]){ 
     dataCurrent.nameOfCat = currentList; 
    } 
    if ([elementName isEqualToString:@"description"]){ 
     dataCurrent.descriptionOfCat = currentList; 
    } 
    if ([elementName isEqualToString:@"image"]) { 
     dataCurrent.imageLink = currentList; 
    } 
    if ([elementName isEqualToString:@"category"]) { 
     [listPopulated addObject:dataCurrent]; 
     dataCurrent = nil; 
     currentList = nil; 
    } 
} 

i plik XML jest jak ten

<category> 
     <name>Food</name> 
     <description>food description</description> 
     <image> Link Here </image> 
      <sub_cat> 
       <sub_name>Sub name</sub_name> 
       <sub_desc>sub cat description</sub_desc> 
       <sub_image> Link </sub_image> 
      </sub_cat> 
      <sub_cat> 
       <sub_name>Sub name</sub_name> 
       <sub_desc>sub cat description</sub_desc> 
       <sub_image> Link </sub_image> 
      </sub_cat> 
</category> 

i badają o Event Driven XML Parsing a także znaleźć gud odwołanie od jednego z wątków xml-parse-only-certain-child-elements, ale w końcu im jeszcze dość mylić o XML i parsowanie. Być może potrzebuję terminu lamer. I chciałbym wiedzieć, jak wykonać część do analizowania.

Odpowiedz

7

mam nadzieję, że można użyć ios natywną samego parsera XML. Twój XML wygląda na bardzo prosty w obsłudze. Po prostu spróbuj utworzyć słownik dla każdego węzła i umieść go w tablicy. W końcu dostaniesz zestaw słowników, z których możesz łatwo iterować swoje dane.

Utwórz NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray, również jeden plik NSString w pliku .h o nazwie currentElement.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    currentElement = elementName; 
    if([elementName isEqualToString:@"category"]){ 
     dataDict = [[NSMutableDictionary alloc] init]; 
    } 
    else if ([elementName isEqualToString:@"sub_cat"]) { 
     if(!subCatArray) { 
      subCatArray = [[NSMutableArray alloc] init]; 
     } 
     subcatDict = [[NSMutableDictionary alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(dataDict && !subCatArray){ 
     [dataDict setObject:string forKey:currentElement]; 
    } 
    else if(subCatArray && subcatDict) { 
     [subcatDict setObject:string forKey:currentElement]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if([elementName isEqualToString:@"category"]){ 
     [dataDict setObject:subCatArray forKey:@"sub_cat"]; 
     [dataArray addObject:dataDict]; 
     subCatArray = nil; 
     dataDict = nil; 
    } 
    else if([elementName isEqualToString:@"sub_cat"]){ 
     [subCatArray addObject:subcatDict]; 
     subcatDict = nil; 
    } 
} 

To ci pomoże.

+0

Zrobiłem to, aż do tej części, im właśnie brakuje teraz jest przekazywanie danych podrzędnych, które są wewnątrz znacznika z mojego nadrzędnego kontrolera widoku do mojego kontrolera widoku podrzędnego. –

+0

następnie utworzyć tablicę subcat i zapisać tę tablicę w dataDict przy użyciu klucza subcat. –

+1

zobacz zaktualizowaną odpowiedź. Teraz będziesz mieć jedną dataDict w dataArray. z którego możesz uzyskać tablicę sub_cat przy użyciu klucza sub_cat. Następnie możesz przekazać go do kontrolera widoku. –

0

Wypróbuj jeden z niezależnych analizatorów składni XML, na przykład RaptureXML.

Następnie należy przeanalizować dane z:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

i zapytania powstałego elementu głównego:

NSLog(@"Category name: %@", [rootXML child:@"name"].text); 

[rootXML iterate:@"image.sub_cat" usingBlock: ^(RXMLElement *e) { 
    NSLog(@"Sub name: %@", [e child:@"sub_name"].text); 
}];  
+0

Czy możesz wyjaśnić trochę, jak parsować dane, zrobiłem parsowanie teraz, ale chciałbym poznać kilka innych sposobów, jak na przykład użycie RaptureXML, i btw im wdrożenie tego na storyboardie, gdzie pokazuję dane macierzyste w pierwszej tabeli wyświetlają dziecko w następnym widoku. –

+0

Możesz przeanalizować dane, tworząc "RXMLElement". Zapytanie o wynikowy obiekt dla pojedynczych elementów za pomocą metody 'child:' i dla wielu elementów za pomocą 'iterate: usingBlock:' jak wyżej. – eik