2013-08-26 71 views
6

imはsub_categoryである子データを解析しようとしていますが、親カテゴリの関連するsub_categoryのみを表示します。私は親要素のデータを解析するのには成功しましたが、子要素を解析する方法に問題がありました。子要素のデータを親要素の子要素から取得する

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

とXMLファイルこの

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

のようなもので、私はEvent Driven XML Parsingについて調査し、また、スレッドxml-parse-only-certain-child-elementsの1からGUDの参照を見つけることが、最終イムでまだかなり程度混同されてXMLとパースするもの。私はラマー用語が必要かもしれません。そして、私のパーシングの仕方を知りたい。

答えて

7

次にあなたがデータを解析:

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

、そして得られたルート要素を照会します。あなたのXMLは扱いがとても簡単です。各ノードの辞書を作成して配列に入れてみてください。最後に、データを簡単に繰り返すことができる辞書の配列を取得します。

NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArrayを作成してください。currentElementという名前の.hファイルのNSStringもあります。

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

これはあなたを助けます。

+0

私はこれをこの部分までやったことがあります。ちょうど今失っているのは、タグ内の子データを私の親ビューコントローラから私の子ビューコントローラに渡すことです。 –

+0

次にsubcatの配列を作成し、その配列をdataDictにsubcatキーを使って保存します。 –

+1

更新された回答を参照してください。これでdataArrayにdataDictが1つあります。そこからsub_catキーを使ってsub_cat配列を得ることができます。次に、ビューコントローラに渡すことができます。 –

0

サードパーティのXMLパーサーの1つ、たとえばRaptureXMLを試してみてください。私はあなたがIOSにネイティブXMLパーサー自体を使用することを願って

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

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

私は与えられたデータをどのように解析するのかを少し説明してください。私は今解析しましたが、raptureXMLを使用するのも好きです。最初のtablevViewの親データ、次に、次のビューの子。 –

+0

データを解析するには、 'RXMLElement'を作成します。 'child:'メソッドを使用して単一要素の結果として得られるオブジェクトを照会し、上記のように 'iterate:usingBlock:'を使用して複数の要素を照会します。 – eik

関連する問題