2013-08-26 13 views
6

Ich versuche, die untergeordneten Daten zu analysieren, die sub_category ist, und zeige sie an, aber es wird nur die relevante Unterkategorie der übergeordneten Kategorie angezeigt. Ich war erfolgreich in der Analyse der Daten des Elternelements, aber ich habe ein Problem, wie das Kindelement zu analysieren.Abrufen von Daten des untergeordneten Elements von seinem übergeordneten Gegenstück

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

und die XML-Datei ist wie dies

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

und ich über die Event Driven XML Parsing erforscht und auch eine gud Referenz von einem der Fäden xml-parse-only-certain-child-elements, aber am Ende im noch ziemlich verwirren finden das XML und das Parsing. Ich könnte einen längeren Begriff brauchen. Und möchte wissen, wie ich meinen Parsing-Teil mache.

Antwort

7

Ich hoffe, dass sich ios native XML-Parser verwenden können. Ihr XML-Code sieht ziemlich einfach zu handhaben aus. Versuchen Sie einfach Dictionary für jeden Knoten zu erstellen und in Array zu setzen. So erhalten Sie endlich eine Reihe von Wörterbüchern, mit denen Sie Ihre Daten einfach iterieren können.

Erstellen NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray, auch eine NSString in .h-Datei mit dem Namen 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; 
    } 
} 

Dies wird Ihnen helfen.

+0

Ich habe dies bis zu diesem Teil gemacht, ich vermisse jetzt gerade die Kind-Daten, die innerhalb des Tags von meinem Eltern-View-Controller zu meinem Kind View-Controller sind. –

+0

Dann erstellen Array von Subcat und speichern Sie dieses Array in DataDict mit Subcat Key. –

+1

siehe die aktualisierte Antwort. Jetzt haben Sie ein DataDict in DataArray. von dem Sie Ihr sub_cat Array mit dem Schlüssel sub_cat erhalten können. Dann können Sie es an Ihren View-Controller übergeben. –

0

Probieren Sie einen der Drittanbieter-XML-Parser aus, z. B. RaptureXML.

Dann analysieren Sie die Daten mit:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

und abfragen, um die resultierende Wurzel Element:

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

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

können Sie bitte ein wenig erklären, wie ich die gegebenen Daten parse, ich habe das Parsing jetzt gemacht, aber ich würde gerne andere Wege kennen, wie die Verwendung von raptureXML, und btw im dies auf Storyboard implementieren, wo ich zeige die übergeordneten Daten in der ersten Tabelle vView, dann das Kind in der nächsten Ansicht. –

+0

Sie können Ihre Daten analysieren, indem Sie ein 'RXMLElement' konstruieren. Das resultierende Objekt wird für einzelne Elemente abgefragt, indem die Methode 'child:' verwendet wird, und für mehrere Elemente wird 'iterate: usingBlock: 'wie oben verwendet. – eik