2011-11-21 136 views
0

分離我有下面的XML架構我試圖遍歷:XML:通過內部節點嵌套節點解析和部分

<routes> 
    <route> 
      <group>Group Name - Will be iPhone section name</group> 
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item> 
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item> 
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item> 
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item> 
    </route> 
    <route> 
      <group>Group 2 - Will be iPhone section name</group> 
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item>   
      <item> 
       <name>Route Name - Will be iphone cell lable</name> 
       <url>Route URL - View Did select lable</url> 
      </item> 
    </route> 
</routes> 

現在大部分都在項目相當多的項目 - 和Group節點將是該部分的標題爲UITableView的

繼承人如何我解析(錯誤地)的XML的時刻:

(這裏是xNode_ declaraions :)

static NSString *xNode_route [email protected]"//route"; 
static NSString *xNode_group [email protected]"group"; 
static NSString *xNode_item= @"//item"; 
static NSString *xNode_name = @"name"; 
static NSString *xNode_url = @"url"; 

下面是解析的代碼:

CXMLDocument *doc = [[CXMLDocument alloc] initWithData:dataReply options:0 error:nil]; 
    NSArray *route = [doc nodesForXPath:xNode_route error:nil];//Root node 
    for (CXMLElement *item in route) 
    { 
     AssessObject *newobj2 = [[AssessObject alloc] init]; 
     NSArray *arryGroup = [item elementsForName:xNode_group]; 
     for(CXMLElement *assGroup in arryGroup) 
     { 

      newobj2.assGroup = assGroup.stringValue; 
      NSLog(@"Assessment Group: %@", assGroup.stringValue); 

     } 

     [groupArray addObject:newobj2]; 


    } 

    NSArray *items = [doc nodesForXPath:xNode_item error:nil];//Root node 
    for (CXMLElement *item in items) 
    { 
     AssessObject *newobj = [[AssessObject alloc] init]; 
     NSArray *arryName = [item elementsForName:xNode_name]; 
     for(CXMLElement *assName in arryName) 
     { 

      newobj.assName = assName.stringValue; 
      NSLog(@"Assessment Name: %@", assName.stringValue); 

     } 

     NSArray *arryUrl = [item elementsForName:xNode_url]; 
     for(CXMLElement *assUrl in arryUrl) 
     { 

      newobj.assUrl = assUrl.stringValue; 
      NSLog(@"Assessment URL: %@", assUrl.stringValue); 


     } 

      [totalArray addObject:newobj]; 
    } 
} 

在它要通過所有的項目X有組的量的時刻,所以某處循環不正確。所以如果有6個組,它會顯示6次重複的項目。

所以這是第一部分,第二部分實際上是如何將陣列分成組並將正確的項目放入組中?

+0

哪個解析器使用烏爾...我知道通過的NSXMLParser ... – mAc

+0

我使用CXML解析器 – TMB87

回答

0

首先,您沒有正確釋放內存。

在發佈的代碼中有6個發佈語句 - 全部刪除它們。

然後,你需要添加兩個聲明:

[release newObj2]; 
爲您明確分配對象

:newObj和newObj2,你將它們添加到陣列之後。

然後,如果事情不起作用,我們可以談論解析。

編輯: 好吧,讓我們來談談解析:

+ (NSMutableArray *) parseResponseString:(NSString *) responseString { 
NSError *error; 
CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString: responseString 
                options: 0 
                 error: &error]; 
if (error) { 
    NSLog(@"CXMLDocument error: %@", [error description]); 
    [doc release]; 
    return nil; 
} 


CXMLElement * el = [doc rootElement]; 
NSMutableArray *theRoutes = [NSMutableArray arrayWithCapacity:128]; // adjust to your needs 

if ([[el name] isEqualToString:@"routes"]) {      // parameterize these string constants 
    for (CXMLElement *childElement in [el children]) { 
     if ([[childElement name] isEqualToString:@"route"]) { 
      Route *aRoute = [[Route alloc] init]; 

      for (CXMLElement *grandChild in [childElement children]) { 
       if ([[grandChild name] isEqualToString:@"group"]) { 
        aRoute.group = [grandChild stringValue]; 
       } else if ([[grandChild name] isEqualToString:@"item"]) { 
        RouteItem *aRouteItem = [[RouteItem alloc] init]; 

        for (CXMLElement *subItem in [grandChild children]) { 
         if ([[subItem name] isEqualToString:@"name"]) { 
          aRouteItem.name = [subItem stringValue]; 
         } else if ([[subItem name] isEqualToString:@"url"]) { 
          aRouteItem.url = [subItem stringValue]; 
         } 
        } 

        if (aRouteItem && aRouteItem.name && aRouteItem.url) { 
         [aRoute.routeItems addObject:aRouteItem]; 
        } 
        [aRouteItem release]; 
       } 
      } 

      if (aRoute && aRoute.group && aRoute.items.count) { 
       [theRoutes addObject:aRoute]; 
      } 
      [aRoute release]; 
     } 
    } 
} 
[doc release]; 
return theRoutes; // this is your array for your tableview data source. 

}

+0

嘿 - 謝謝,我修復了這個問題並添加了版本 - 我的解析仍然是重複的,儘管 – TMB87

+0

@Tom - 不知道是什麼原因導致了這個問題,但是爲了解決問題2,你需要以不同的方式進行解析。不要將XML glob視爲不透明的數據庫並進行查詢,只需從上到下進行解析,隨時隨地構建數據結構。創建這些對象:Route和RouteItem。 Route有一個組成員(NSString *)和一個RouteItem數組。 RouteItem擁有名稱和Url的成員。然後將這個數組提供給你的tableView,cellForRowAtIndexPath可以把它分開來顯示你想要的。看到上面的代碼(我不應該爲你寫代碼,但你的跳舞網站讓我感到好笑)。 – Rayfleck