2013-08-26 31 views
6

im bunu sub_category olan çocuk verilerini ayrıştırmak ve göstermeye çalışıyor, ama sadece ana kategorinin ilgili sub_category gösterecektir. Ebeveyn unsurunun verilerini ayrıştırmakta başarılı oldum ama çocuk elemanını nasıl ayrıştıracağım konusunda bir problemim var. Verilerin

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

ve XML dosyası, bu

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

gibi ve ben Event Driven XML Parsing hakkında araştırma ve aynı zamanda iş parçacığı xml-parse-only-certain-child-elements birinden bir gud başvuru bulmak, ancak son im vasıl hala oldukça yaklaşık şaşırtmak edilmiş XML ve ayrıştırma maddeleri. Bir lamer terimine ihtiyacım olabilir. Ayrıştırma bölümümü nasıl yapacağımı bilmek isterim.

cevap

7

Sana ios yerli xml ayrıştırıcı kendisi kullanabilir umuyoruz. XML'iniz işlemek için oldukça basit görünüyor. Her düğüm için Sözlük oluşturmayı deneyin ve diziye koyun. Sonuç olarak, verilerinizi kolayca yineleyebileceğiniz bir dizi sözlük alacaksınız.

NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray oluşturun, currentElement adlı .h dosyasında bir NSString .h dosyası var.

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

Bu size yardımcı olacaktır.

+0

ben bu kısmı kadar yaptık, im sadece şimdi eksik Çocuğum görünümü denetleyicisi benim ana görünümü denetleyicisinden etiketinin içine olan çocuk verilerini geçiyor. –

+0

sonra alt küme dizisi oluşturun ve subcat anahtarını kullanarak dataDict'ta bu diziyi kaydedin. –

+1

güncellenen cevaba bakınız. Şimdi dataArray'da bir dataDict olacak. sub_cat dizininizi sub_cat anahtarını kullanarak alabilirsiniz. Ardından görüntü denetleyicinize iletebilirsiniz. –

0

örneğin RaptureXML için, üçüncü taraf XML ayrıştırıcıları birini deneyin.

Sonra verileri ayrıştırmak:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

ve elde edilen kök Eleman sorgulamak:

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

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

sen, şimdi ayrıştırılmasını yaptık i verilen verileri ayrıştırmak nasıl biraz açıklayabilir misiniz ama çok raptureXML kullanmak gibi bazı başka yollar bilmek ister ve btw nerede gösterileceği film şeridinde bu uygulamaya im ediyorum İlk tablodaki ana verilervView, ardından sonraki görünümdeki çocuk. –

+0

Verilerinizi bir "RXMLElement" oluşturarak ayrıştırabilirsiniz. 'Child:' yöntemini kullanarak tek elemanlar için ortaya çıkan nesneyi ve yineleme elemanlarını 'iterate: usingBlock:' yukarıdaki gibi kullanarak sorgulayın. – eik

İlgili konular