2011-09-13 32 views
2

解析子元素我的XML看起來是這樣的:與TBXML

<root> 
<sets> 
    <childSets> 
     <childs> 
      <child> 
       <childId>11</childId> 
     </child> 
     <child> 
      <childId>22</childId> 
     </child> 
     <child> 
      <childId>33</childId> 
     </child> 
     <child> 
      <childId>44</childId> 
     </child> 
[...] 
    </childs> 
</childSets> 

    <childSets> 
[...] 
    </childSets> 
</sets> 
</root> 

我想收杆的child所有childId元素。

其實,我分析的結果只是第一childIdchilds元素:

[...] 
do { 
    if ([[TBXML elementName:element] isEqualToString:@"childSet"]) { 
    [...] 
     TBXMLElement *xmlChildId  = [TBXML childElementNamed:@"childId"   parentElement:child]; 
    [...] 
    } 
} while ((element = element->nextSibling)); 
[...] 

在這種情況下,我只是得到11。這裏有什麼問題?

編輯1:

的解決辦法是找到子元素的第一個孩子,並解析這個接下來的元素,那就是:

此代碼是在do while循環的方法traverseElement

do { [...] 
     if ([[TBXML elementName:element] isEqualToString:@"childSet"]) { 
     //find the first child 
      if ((ChildPARENTELEMENT->firstChild)) { 

      while (ChildOfCHILDELEMENT!=nil) { 
       NSLog(@"...."); 

       ChildOfCHILDELEMENT = [TBXML nextSiblingNamed:@"childs" searchFromElement:ChildOfCHILDELEMENT]; 

      } 
     } 
    } 
while((element = element->nextSibling)); 
+0

你仍然堅持在這? – Sam

+0

是的,第二個是在崩潰應用程序時執行的。我不知道如何解決第二個循環。你能給我一個建議嗎? – brush51

+0

請包含有關您所看到的錯誤的更多信息。你是否得到SIGABRT?應用程序關閉,沒有日誌/調試信息?如果有調試信息,哪條線路崩潰並出現什麼錯誤信息? – Sam

回答

3

的解決辦法是找到子元素的第一個孩子,並解析這個接下來的元素,那就是:

此代碼是在做while循環的方法traverseElement

do { [...] 
    if ([[TBXML elementName:element] isEqualToString:@"childSet"]) { 
    //find the first child 
     if ((ChildPARENTELEMENT->firstChild)) { 

     while (ChildOfCHILDELEMENT!=nil) { 
      NSLog(@"...."); 

      ChildOfCHILDELEMENT = [TBXML nextSiblingNamed:@"childs" searchFromElement:ChildOfCHILDELEMENT]; 

     } 
    } 
} 
while((element = element->nextSibling)); 
+0

+1,感謝您發佈答案。 – Sam

0

您需要一個內部循環遍歷所有子xml元素。 childElementName:parentElement:將僅返回具有該名稱的第一個孩子。

嘗試類似:

[...] 
do { 
    if ([[TBXML elementName:element] isEqualToString:@"childSet"]) { 
     [...] 
     TBXMLElement *xmlChildId = [TBXML childElementNamed:@"childId" 
              parentElement:child]; 
     do { 
     // Do nslog or whatever else on xmlChildId 
     [...] 

     // Find next child element to process 
     xmlChildId = [TBXML nextSiblingName:@"childId" 
          searchFromElement:xmlChildId]; 
     } while (xmlChildId != nil); 
    } 
} while ((element = element->nextSibling)); 
[...] 
+0

這對你有幫助嗎?如果沒有,請分享更多的代碼。那裏有不少。 – Sam

+0

不,它不幫助。該循環崩潰的應用程序。日誌和與其他childelements相同的解析行。 – brush51

+0

你提醒我正確的方向,非常感謝你。我已經解決了它,我的代碼在那裏。再次感謝。 – brush51