2012-09-23 72 views
0

我將查詢發送到服務器,並得到響應使用此代碼解析XML數據轉換成NSMutable數組列表

NSString *urlString = @"myPHPQuery"; 
NSURL *parserUrl = [[[NSURL alloc] initWithString:urlString] autorelease]; 
     NSXMLParser *parser = [[[NSXMLParser alloc] initWithContentsOfURL:parserUrl] autorelease]; 
     [parser setDelegate:self]; 
     [parser parse]; 

我能得到這個類型的響應

<users> 
          <username>nothan</username> 
          <score>1000</score>       
          </users> 
<users> 
          <username>nothan</username> 
          <score>1000</score>       
          </users> 

我使用這個代碼解析在可變數組數據

int arrayCount = 0; 

NSString *elementname; 
NSInteger * count; 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{  
    elementname = elementName; 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 

    if([elementname isEqualToString:@"username"]) 
    { 
     if (count == 0) 
     { 
      NSLog(@"%@" , string); 
      [self.playerNames replaceObjectAtIndex:arrayCount withObject:string]; 
      arrayCount = arrayCount + 1; 
      count = count + 1 ; 
     } 
     else 
      count = 0; 

    } 
    else if([elementname isEqualToString:@"score"]) 
    { 
     if (count == 0) 
     { 
      NSLog(@"%@" , string); 

      [self.scores replaceObjectAtIndex:arrayCount withObject:string]; 
      count = count + 1 ; 
     } 
     else 
      count = 0; 
    } 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 

    for (int i = 0 ; i <10 ; i++) 
    { 
     NSLog(@"%d - %@" , i,[playerNames objectAtIndex:i]); 
    } 
} 

這段代碼的問題是,它僅檢索一個

<users> .... </users>如何更改此代碼以使其檢索更多用戶。

問候

回答

1

對於上面發佈的示例XML,解析器運行正確。

Extensible Markup Language (XML) 1.0 (Fifth Edition) §2.1 Well-Formed XML Documents

有且僅有一個元件,稱爲根,或文檔元素

第一<users>…</users>元件被解析之後,文檔已經完成和解析器停止。

要在XML文檔中擁有一個列表,您必須將它們包裝在一個外部元素中。

<allusers> 
    <users> 
    <username>nothan</username> 
    <score>1000</score>       
    </users> 
    <users> 
    <username>nothan</username> 
    <score>1000</score>       
    </users> 
</allusers> 
+0

讓我試試這:) – user996428

0

當解析器foundCharacters方法被稱爲詮釋計數檢查。如果它爲零,則數組中的第一個條目被替換,並且計數遞增。在下次調用此方法時,計數不爲零,因此沒有任何內容被替換,然後將計數設置回零。對於下一次調用此方法的計數爲零.....等等。

還要記住,當從網絡中檢索的數據足夠大以便通過tcp/ip分割成塊時,initWithContentsOfURL可能不會返回全部數據。最好使用NSURLConnection將接收到的數據構建爲NSData對象,然後將其傳遞給解析器。此外,對於給定元素,可能會有多次對foundCharacters的調用,因此應該構建收到的元素,並且應該在委託didEndElement方法中進行放置。

+0

計數是爲了防止一些空格。它與我的問題無關:) – user996428