2011-10-19 12 views
0

の配列は、このXMLカルコゲノフルバレン骨格を考えてみましょ作る:XML解析、:配列や辞書

<api> 
    <status>200</status> 
    <message>OK</message> 
    <response> 
     <item> 
     <id>1</id> 
     <image/> 
     <title>Some title</title> 
     <text/> 
     <email>some email</email> 
     <channels> 
      <item> 
       <id>1</id> 
       <group_id>1</group_id> 
       <image>/path/to/image.png</image> 
       <title>Some other title</title> 
       <text/> 
      </item> 
      <item> 
       <id>2</id> 
       <group_id>1</group_id> 
       <image>/path/to/image.png</image> 
       <title>Some other title</title> 
       <text/> 
      </item> 
     </item> 
    </response> 
</api> 

応答およびチャネルの下で任意の数の項目の下の項目の数に制限はありませんでした。実際には、この構造はさまざまなデータの多くに使用されていますが、generelのレイアウトは次のようになります(ただし、各xml要素の名前はわかりません)

私はXMLパーサを使用しています

.. nsarraysとnsdictionariesの組み合わせには、この構造を解析する今、私は次のことを得たが、IAMなく、かなりそこはまだ!(と私はIAM何不足している上に指を置くように見える傾ける。

目的-Cコード:

- (NSArray*) parsedResponse 
{ 
    TBXML *xml = [[TBXML alloc] initWithXMLData:self.responseData]; 
    TBXMLElement *rootXML = xml.rootXMLElement; 

    NSArray *_data; 

    if(rootXML != nil) 
    { 
     TBXMLElement *xml = [TBXML childElementNamed:@"status" parentElement:rootXML]; 
     if(xml != nil) 
      _data = [NSArray arrayWithObject:[self traverseElement:xml]]; 
    } 

    return [_data autorelease]; 
} 

- (NSMutableDictionary*) traverseElement:(TBXMLElement*)_element 
{ 
    NSMutableDictionary *_items = [[NSMutableDictionary alloc] init]; 

    if(_element != nil) 
    { 
     int i = 0; 
     do { 
      if(_element == nil) 
       continue; 

        // If there is a firstChild, there is subelements 
      if(_element->firstChild) 
      { 
          //need to do some magic here? i can't figure it out.. 
       NSArray *_item = [NSArray arrayWithObject:[self traverseElement:_element->firstChild]]; 
       NSString *key = [NSString stringWithFormat:@"%@%d", [TBXML elementName:_element], i]; 

       [_items setValue:_item forKey:[TBXML elementName:_element]]; 

      } 
      else 
       [_items setValue:[TBXML textForElement:_element] forKey:[TBXML elementName:_element]]; 

      i++; 

     } while ((_element = _element->nextSibling)); 
    } 

    return [_items autorelease]; 
} 

何か提案がありますか?

答えて

1

NSXMLParserとそのデリゲートメソッドを使用します。

parser:didStartElement:namespaceURI:qualifiedName:attributes: 

    parser:foundCharacters: 

    parser:didEndElement:namespaceURI:qualifiedName: 

XML Parsing Guideを参照してください。