2013-01-09 75 views
0

我需要解析在這類XML的多個元件(ID1和ID2):解析在目標c XML的多個元素

<name> 
    <id1>104634449</id2> 
    <id2>22014870</id2> 
</name> 
<name> 
    <id1>104634433</id2> 
    <id2></id2> 
</name> 

我使用這樣的代碼:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    isName = [elementName isEqualToString:@"name"]; 
    isId1 = [elementName isEqualToString:@"id1"]; 
    isId2 = [elementName isEqualToString:@"id2"];  
    if(isName){ 
     name = [Name new]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
     if (isName){ 
      [names addObject:name]; 
     } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (isId1){ 
     [name setId1:string]; 
    } 
    if (isId2){ 
     [name setId2:string]; 
    } 
} 

但在對象名稱中只設置了一個元素(id1或id2)。我做錯了什麼?

在調試我得到這個: ID1 = @「\ n」 ID2 = @「22014870」

回答

0

問題是,當你讀完id2時,isName被設置爲NO,所以你不會真的把它添加到你的數組中。

這是動作序列:

  1. name元素開始;
  2. id1元素開始;
  3. id1元素結束;
  4. id2元素開始;
  5. id2元素結束;
  6. 名稱元素結束。

在4點發生isName的最後分配,設置爲:

isName = [elementName isEqualToString:@"name"]; 

這將導致錯誤。

校正代碼

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
     if ([elementName isEqualToString: @"name"){ 
      [names addObject:name]; 
     } 
} 
0

獲得XML解析的腸子太深之前我會強烈建議使用GDataXMLNode(也可作爲一CocoaPod)

然後,爲了獲取如何使用它,看看這個教程的想法,How To Read and Write XML Documents with GDataXML

我知道這並不直接回答你的問題,但它是真的這麼簡單得多使用這個庫由Google提供。

+0

好惡。這僅僅是libxml2的一個包裝,它是一個更快,更強大,功能更豐富的版本。花時間在建議執行速度較慢的補丁作業之前瞭解內置庫的工作原理。僅僅因爲它的名稱'Google'並不意味着它更好,例如,GData不支持複雜XPath查詢(返回字符串或節點以外的類型),而本機libxml2則支持這種查詢。 –

+0

理查德不錯,包裝有時非常受歡迎。我通常更喜歡在出現性能問題時處理,而不是花時間過早地優化。我還沒有遇到任何性能問題,但仍然使用它來滿足我的需求。當然,「Google」並不立即意味着更好,「考慮」將是比「強烈推薦」更好的單詞選擇。 –