2013-08-26 5 views
6

nel tentativo di analizzare i dati secondari che sono sub_category e mostrarli, ma mostreranno solo la sottocategoria pertinente della categoria padre. Ho avuto successo nell'analisi dei dati dell'elemento genitore ma ho avuto un problema su come analizzare l'elemento figlio.Recupero dei dati di Elemento figlio dalla controparte madre

- (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; 
    } 
} 

e il file XML è come questo

<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> 

ed io stato occupando circa il Event Driven XML Parsing e trovare anche un riferimento gud da uno dei fili xml-parse-only-certain-child-elements, ma alla fine im ancora piuttosto confondere su l'XML e le cose da analizzare. Potrei aver bisogno di un termine Lamer. E vorrei sapere come eseguire la mia parte di parsing.

risposta

7

Spero che è possibile utilizzare iOS nativo XML Parser stessa. Il tuo XML sembra abbastanza semplice da gestire. Basta provare a creare un dizionario per ogni nodo e inserirlo nell'array. Così finalmente otterrai una serie di dizionari dai quali puoi facilmente iterare i tuoi dati.

Creare NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray, avere anche uno NSString nel file .h 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; 
    } 
} 

Questo ti aiuterà.

+0

ho fatto questo fino a questa parte, mi manca solo ora sta passando i dati figlio che si trovano all'interno del tag dal mio controller di visualizzazione genitore al mio controller di visualizzazione figlio. –

+0

quindi creare una matrice di subcat e salvare quell'array in dataDict utilizzando la chiave subcat. –

+1

vedere la risposta aggiornata. Ora avrai un dataDict in dataArray. da cui è possibile ottenere l'array sub_cat utilizzando la chiave sub_cat. Quindi puoi passarlo al tuo controller di visualizzazione. –

0

Provare uno dei parser XML di terze parti, ad esempio RaptureXML.

Poi si analizza i dati con:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

e Query l'elemento principale risultante:

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

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

puoi spiegare un po 'come analizzare i dati forniti, ho eseguito l'analisi adesso, ma mi piacerebbe sapere anche in altri modi come usare il raptureXML, e tra l'altro implementarlo nello storyboard in cui mostro i dati principali sul primo tablevView, quindi il figlio nella vista successiva. –

+0

È possibile analizzare i dati costruendo un 'RXMLElement'. Query l'oggetto risultante per i singoli elementi usando il metodo 'child:' e per gli elementi mutiple usando 'iterate: usingBlock:' come sopra. – eik